在 Flutter 中将来自 JSON 的双精度解码为 Decimal

问题描述 投票:0回答:1

我在 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));
json flutter dart decimal flutter-dependencies
1个回答
0
投票

也许这个例子会对你有所帮助。

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}
© www.soinside.com 2019 - 2024. All rights reserved.