【问题标题】:Flutter DistanceMatrix JSON won't parse correctlyFlutter DistanceMatrix JSON 无法正确解析
【发布时间】:2020-07-24 18:41:17
【问题描述】:

我已阅读并尝试了所有帖子/视频,但没有任何效果。请帮助对代码感兴趣的网络管理员。

我不知道如何将返回的 json 对象转换为我可以使用的可用列表/字符串。我只需要元素 -> 距离 -> 文本和文本小部件的值。

返回的 JSON 对象

{
   "destination_addresses" : [ "The destination address" ],
   "origin_addresses" : [ "The origin address" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "7 m",
                  "value" : 7
               },
               "duration" : {
                  "text" : "1 min.",
                  "value" : 1
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

代码 sn-p(删除之前的尝试):

Future<String> getLinkForCalculation() async{
    var _latUser = "INSERT LATUSER";
    var _lonUser = "INSERT LONUSER";
    var _latClient = "INSERT LATCLIENT";
    var _lonClient = "INSERT LONCLIENT";
    var _key = "INSERT_API_KEY";
    var link = "https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins=$_latUser,$_lonUser&destinations=$_latClient,$_lonClient&key=$_key";
    print(link);
    return link;
  }


  Future<List> calculateDistanceFromLink()async{
    var link = await getLinkForCalculation();
    Dio finalLink = new Dio();
    Response distanceData = await finalLink.get(link);

    print(distanceData.data);

  }

我已阅读并尝试过:

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    将以下代码保存为MapResponse.dart,然后使用

    将您的响应正文解析为该模型

    final mapResponse = mapResponseFromJson(jsonString);

    //
    //     final mapResponse = mapResponseFromJson(jsonString);
    
    import 'dart:convert';
    
    class MapResponse {
        final List<String> destinationAddresses;
        final List<String> originAddresses;
        final List<Row> rows;
        final String status;
    
        MapResponse({
            this.destinationAddresses,
            this.originAddresses,
            this.rows,
            this.status,
        });
    
        factory MapResponse.fromJson(String str) => MapResponse.fromMap(json.decode(str));
    
        String toJson() => json.encode(toMap());
    
        factory MapResponse.fromMap(Map<String, dynamic> json) => MapResponse(
            destinationAddresses: json["destination_addresses"] == null ? null : List<String>.from(json["destination_addresses"].map((x) => x)),
            originAddresses: json["origin_addresses"] == null ? null : List<String>.from(json["origin_addresses"].map((x) => x)),
            rows: json["rows"] == null ? null : List<Row>.from(json["rows"].map((x) => Row.fromMap(x))),
            status: json["status"] == null ? null : json["status"],
        );
    
        Map<String, dynamic> toMap() => {
            "destination_addresses": destinationAddresses == null ? null : List<dynamic>.from(destinationAddresses.map((x) => x)),
            "origin_addresses": originAddresses == null ? null : List<dynamic>.from(originAddresses.map((x) => x)),
            "rows": rows == null ? null : List<dynamic>.from(rows.map((x) => x.toMap())),
            "status": status == null ? null : status,
        };
    }
    
    class Row {
        final List<Location> elements;
    
        Row({
            this.elements,
        });
    
        factory Row.fromJson(String str) => Row.fromMap(json.decode(str));
    
        String toJson() => json.encode(toMap());
    
        factory Row.fromMap(Map<String, dynamic> json) => Row(
            elements: json["elements"] == null ? null : List<Location>.from(json["elements"].map((x) => Location.fromMap(x))),
        );
    
        Map<String, dynamic> toMap() => {
            "elements": elements == null ? null : List<dynamic>.from(elements.map((x) => x.toMap())),
        };
    }
    
    class Location {
        final Distance distance;
        final Distance duration;
        final String status;
    
        Location({
            this.distance,
            this.duration,
            this.status,
        });
    
        factory Location.fromJson(String str) => Location.fromMap(json.decode(str));
    
        String toJson() => json.encode(toMap());
    
        factory Location.fromMap(Map<String, dynamic> json) => Location(
            distance: json["distance"] == null ? null : Distance.fromMap(json["distance"]),
            duration: json["duration"] == null ? null : Distance.fromMap(json["duration"]),
            status: json["status"] == null ? null : json["status"],
        );
    
        Map<String, dynamic> toMap() => {
            "distance": distance == null ? null : distance.toMap(),
            "duration": duration == null ? null : duration.toMap(),
            "status": status == null ? null : status,
        };
    }
    
    class Distance {
        final String text;
        final int value;
    
        Distance({
            this.text,
            this.value,
        });
    
        factory Distance.fromJson(String str) => Distance.fromMap(json.decode(str));
    
        String toJson() => json.encode(toMap());
    
        factory Distance.fromMap(Map<String, dynamic> json) => Distance(
            text: json["text"] == null ? null : json["text"],
            value: json["value"] == null ? null : json["value"],
        );
    
        Map<String, dynamic> toMap() => {
            "text": text == null ? null : text,
            "value": value == null ? null : value,
        };
    }
    

    【讨论】:

    • 但是如何使用 FutureBuilder 中返回的值?
    • 您可以通过调用mapresponse.destinationAddresses访问该对象内的数据
    【解决方案2】:

    我不是 Flutter 开发人员,因此无法在 Text 小部件部分为您提供帮助。但是我已经做了这个例子来说明如何从 JSON 中获取值:

    import 'dart:convert';
    
    class Element {
      final String text;
      final int value;
    
      Element.fromJson(dynamic json)
          : text = json['text'] as String,
            value = json['value'] as int;
    
      @override
      String toString() => 'text: $text\nvalue: $value';
    }
    
    void main() {
      const jsonString = '''
      {
       "destination_addresses" : [ "The destination address" ],
       "origin_addresses" : [ "The origin address" ],
       "rows" : [
          {
             "elements" : [
                {
                   "distance" : {
                      "text" : "7 m",
                      "value" : 7
                   },
                   "duration" : {
                      "text" : "1 min.",
                      "value" : 1
                   },
                   "status" : "OK"
                }
             ]
          }
       ],
       "status" : "OK"
    }
    ''';
    
      final dynamic jsonObj = json.decode(jsonString);
    
      final list = Element.fromJson(jsonObj['rows'][0]['elements'][0]['distance']);
      print(list);
    }
    

    如您所见,如果数据类型是动态的,那么浏览 JSON 以从中获取特定数据非常容易。这样做的副作用是类型安全从分析仪中消失了,因此您应该只在小的孤立区域使用动态的力量,例如。解析然后返回正常类型的安全对象并在其余代码中使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 2013-10-14
      • 2012-08-12
      • 2021-09-24
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      相关资源
      最近更新 更多