在 Flutter 和 Dart 中从 JSON 解析双精度值

Posted

技术标签:

【中文标题】在 Flutter 和 Dart 中从 JSON 解析双精度值【英文标题】:Parsing double values from JSON in Flutter and Dart 【发布时间】:2019-06-14 02:11:51 【问题描述】:

我在 Flutter 中尝试从 JSON 获取双精度值时遇到问题。

class MapPoint 
  String title;
  double lat;
  double lng;

  MapPoint(this.title, this.lat, this.lng);

  factory MapPoint.fromJson(Map<String, dynamic> json) 
    return MapPoint(
        title: json["title"] as String,
        lat: json["lat"] as double,
        lng: json["lng"] as double
    );
  

由于某种原因,我得到了错误

Dart 错误:未处理的异常:类型“double”不是 输入“字符串”

我向用户 double.parse(json["lng"]) 尝试了一些,但得到了同样的错误。 同时,这种从 JSON 获取数据的方式也适用于其他类型。

这是 JSON 示例

 
   point: 
     title: "Point title",
     lat: 42.123456,
     lng: 32.26567
  

【问题讨论】:

什么 JSON 会导致这个错误?如果您的值用引号括起来,它们将不会被解释为双精度值。 JSON 很好,因为我可以从中获取所有其他值(sting 和 int) 要么 JSON 不适合您的代码,要么您的代码不适合您的 JSON。如果不提供导致错误的 JSON,您也可以删除问题,因为它没有提供诊断问题所需的信息。 我添加了 JSON 的示例。可能不寻常的一件事是双精度值不会以字符串形式呈现。 那不是有效的 JSON。在 JSON 中,必须引用键,并且在 "Point title" 之后缺少 ,。双精度值在 JSON 中永远不会表示为 String 【参考方案1】:

Dart JSON 解析器转换 json 中的属性,显然它足够聪明,可以吐出一个 double 类型。

someVariable as double 期望左侧有一个字符串。

可能发生的事情是您试图将双精度转换为双精度。

我会尝试这样的事情:

lat: json["lat"].toDouble(),

这将涵盖 JSON 中的数据类似于“5”的情况。在这种情况下,dart json 转换器会将类型转换为 int,如果您总是期待双精度,它会破坏您的代码。

【讨论】:

纬度:double.parse(json["lat"]) 如果您不确定类型是 int 还是 double;最好将其声明为num【参考方案2】:

我遇到了同样的问题,我认为是这样的:

class MapPoint 
  String title;
  double lat;
  double lng;

  MapPoint(this.title, this.lat, this.lng);

  factory MapPoint.fromJson(Map<String, dynamic> json) 
    return MapPoint(
        title: json["title"] as String,
        lat: json["lat"] is int ? (json['lat'] as int).toDouble() : json['lat'],
        lng: json["lng"] is int ? (json['lng'] as int).toDouble() : json['lng']
    );
  

【讨论】:

【参考方案3】:

我无法复制

void main() 
  final json = 
    "point": "title": "Point title", "lat": 42.123456, "lng": 32.26567
  ;
  final p = MapPoint.fromJson(json);
  print(p);


class MapPoint 
  String title;
  double lat;
  double lng;

  MapPoint(this.title, this.lat, this.lng);

  factory MapPoint.fromJson(Map<String, dynamic> json) 
    return MapPoint(
        title: json["title"] as String,
        lat: json["lat"] as double,
        lng: json["lng"] as double);
  

【讨论】:

【参考方案4】:

我可以这样解决这个问题

class MapPoint 
  String title;
  double lat;
  double lng;

  MapPoint(this.title, this.lat, this.lng);

  factory MapPoint.fromJson(Map<String, dynamic> json) 
    return MapPoint(
        title: json["title"] as String,
        lat: json["lat"] *1.0,
        lng: json["lng"] *1.0
    );
  

【讨论】:

以上是关于在 Flutter 和 Dart 中从 JSON 解析双精度值的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter/Dart 中从字节加载图像的问题

在 Flutter Web 中从 JS 调用 Dart 方法

在flutter应用程序中从Firebase检索数据时

如何在flutter中从streambuilder导航到其他页面?

Flutter 中的 JSON ObjectMapper

如何在 dart 中从服务器解码 json?