我在 Flutter 中有一个 Product 类,其中包含一个
Decimal
类型的字段,使用十进制扩展(https://pub.dev/packages/decimal),但是 JSON 中的字段以 float
形式出现
来自服务器。这样,jsonDecode
默认方法将值直接转换为double
,这可能会产生一些精度误差。有什么办法可以解决这个问题吗
我的班级示例:
import "package:decimal/decimal.dart";
class Product
{
String? name;
Decimal? price;
Product({required this.name, required this.price});
factory Product.fromJson(Map<String, dynamic> json) {
return Product(
name: json['name'],
price: Decimal.tryParse(json['price']) //Error: json['price'] comes as double
);
}
}
JSON 示例:
{
"name": "Product XXX",
"price": 12.97
}
使用默认的
jsonDecode
方法:
import 'dart:convert';
//...
Product.fromJson(jsonDecode(response.body));
也许这个例子会对你有所帮助。
import 'package:parser_combinator/extra/json_parser.dart' as json_parser;
import 'package:parser_combinator/parser_combinator.dart';
import 'package:parser_combinator/parsing.dart';
import 'package:parser_combinator/runtime.dart';
import 'package:parser_combinator/tracing.dart';
void main(List<String> args) {
String? key;
var count = 0;
var start = 0;
Result<O>? parse<O>(
Parser<StringReader, O> parser, State<StringReader> state) {
start = state.pos;
if (parser.name == '_keyValue') {
count = 2;
}
final result = parser.parse(state);
if (result == null) {
return result;
}
switch (parser.name) {
case '_string':
if (count > 0) {
count--;
key = result.value as String?;
}
break;
case '_value':
if (count > 0) {
count--;
if (key == 'price') {
final value = state.input.substring(start, state.pos).trim();
return Result(value) as Result<O>;
}
}
break;
}
return result;
}
final builder = TracerBuilder(
parse: parse,
filter: <O>(parser) {
return const {
'_keyValue',
'_string',
'_value',
}.contains(parser.name);
},
);
final tracer = builder.build(json_parser.parser);
final result = parseString(tracer.parse, _data);
print(result);
}
const _data = '''
{
"name": "Product XXX",
"price": 12.99999999999999999999999999999999999999999999999999999
}
''';
输出:
{name: Product XXX, price: 12.99999999999999999999999999999999999999999999999999999}