【问题标题】:Dart: How to json decode '0' as doubleDart:如何将 '0' json 解码为双精度
【发布时间】:2018-09-11 16:43:20
【问题描述】:

我有一个向我发送值列表的服务,在使用 'dart:convert json.decode' 解析后,我得到了一个 List json:

(values) [ 0.23, 0.2, 0, 0.43 ]

当我尝试将值解析为“double”时,出现解析错误

double value = values[2] // error

因为如果我们检查每个元素的 .runtimeType 我们可以看到我们有以下内容

[double, double, int, double]

那么,我怎样才能避免 '0' 被解释为 int 呢? 我想避免使用这样的函数:

double jsonToDouble(dynamic value) {
  if(value.runtimeType == int) {
    return (value as int).toDouble();
  }
  return value;
}

【问题讨论】:

  • 您是否尝试映射值数组? values .map((i) => i.toDouble()).toList();
  • 我会更新我的问题,因为我从“列表值”开始,这是我提到的列表,如果我像你提到的那样进行映射,我最终会得到一个“列表”而不是我需要的 'List'。

标签: dart


【解决方案1】:

您可以通过使用 reviver 构建自己的编解码器来为 JSON 解码添加一些特殊逻辑。将为地图中的每个属性或列表中的项目调用此回调。

  final myJsonCodec = new JsonCodec.withReviver((dynamic key, dynamic value) {
     if (value is int) return value.toDouble();
     return value;
  });

但是,您将总是从dart:covert 获得List<dynamic>,无论您的所有数字类型是否都是双精度数或整数。根据您使用的飞镖版本可能可以使用List.cast 转换为List<double>。

List<double> values = oldValues.cast<double>();

如果这不可用,您可以创建一个新的 List&lt;double&gt; 并向其中添加您的值,以便正确设置运行时类型。

【讨论】:

    【解决方案2】:

    Double 有一个toDouble() 方法。因此,您可以在两种情况下使用它(double 和 int)。

    double jsonToDouble(dynamic value) {
       return value.toDouble();
    }
    

    这只有在值是double 或int 时才有效。如果值为string,则会发生异常。

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 2020-07-01
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 2020-10-03
      • 1970-01-01
      • 2012-10-21
      相关资源
      最近更新 更多