【问题标题】:Flutter: how to decode this complex JSON stringFlutter:如何解码这个复杂的 JSON 字符串
【发布时间】:2019-05-26 21:12:10
【问题描述】:

从我的 REST API 接收一个 JSON 字符串作为

{“总数”:“30”,“结果”:[ {"ID":"1809221034017","DATE":"2018-09-22","REG":"(E9)","START":"10:40","END":"10:48" }, {"ID":"1809221337250","DATE":"2018-09-22","REG":"(E4)","START":"13:43","END":"13:57" }, {"ID":"1809161032213","DATE":"2018-09-16","REG":"(E1)","START":"11:04","END":"11:13" }]}

total 字段告诉我数据库总共包含 30 条记录,请求的数据(仅 3 行)包含在结果部分中。

我需要解析数据,所以我可以在 ListView 中显示结果。我设法用一个简单的 JSON 字符串做到了这一点,但没有用这个复杂的 JSON 字符串。不幸的是,我无法更改 Web 服务的输出,因为它是由第三方托管的。

感谢任何帮助或代码示例。

提前致谢

【问题讨论】:

  • 显示您尝试过的代码?到目前为止你做了什么来解码这个 json?
  • 复杂? results 只是一个地图数组......所以你可以像这样访问它:results[0]["ID"]
  • 看看this也读过所有的cmets。
  • 再看看我的回答^^

标签: json flutter decode


【解决方案1】:

所以在这里我们可以看到有一个 JSON 对象有两个值,一个 JSON 数组和一个总数。有时由于网络问题,互联网服务不会返回完整值,而只返回一部分。 所以现在在数组中,我们有许多结果对象,其 ID、DATE、REG、START、END。 如果您格式化 JSON,您将轻松解码。

【讨论】:

  • 感谢您的意见。它是直截了当的,但我没有以这种方式看到它。我太专注于只解析结果数组。这将工作
  • 在您的情况下,您有一组用于结果字段的地图。像 List > 列表中的每个地图都会有键:ID、DATE、REG、START、END 和相应的值。
  • 您可以在这里轻松获得此视图jsonformatter.curiousconcept.com我是否能够回答您的问题。
【解决方案2】:

我推荐这篇文章:https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51

 class Result
            {
               String id ;
                 String date;
                 String reg ;
                 String start;
                 String end ;

            Result({this.date,this.end,this.id,this.reg,this.start});

            factory Result.fromJson(Map<String, dynamic> parsedJson) {

             return new Result(
               id: parsedJson['ID'],
               date: parsedJson['DATE'],
               reg: parsedJson['REG'],
               start: parsedJson['START'],
               end: parsedJson['END'],
             );
          }
            }

             class Results
            {
                 String total;
                 List<Result> results;

                Results({this.results, this.total});
                factory Results.fromJson(Map<String, dynamic> parsedJson) {
                var list = parsedJson['results'][] as List;
                return new Results(
                total: parsedJson['total'],
                results: list.map((i) => Result.fromJson(i)).toList());
            }}

【讨论】:

    【解决方案3】:

    请先阅读我的other answer here

    那我建议你使用像quicktype这样的类生成库。

    例如,使用快速类型,您可以使用 JSON 轻松自动地在 dart 中生成模型类。 Here the generated file.

    quicktype --lang dart --all-properties-optional https://www.shadowsheep.it/so/53968769/testjson.php -o my_json_class.dart
    

    然后在代码中使用:

    import 'my_json_class.dart';
    import 'package:http/http.dart' as http;
    
    var response = await http.get('https://www.shadowsheep.it/so/53968769/testjson.php');
        var myClass = MyJsonClass.fromJson(jsonDecode(response.body));
        for(var result in myClass.results.toList()) {
           print(result?.id);
        }
    

    注意如果您掌握了代码生成器库,那么您将能够解析来自REST API 的任何类型的 JSON,您将有更多的时间享受乐趣。

    【讨论】:

      猜你喜欢
      • 2011-01-15
      • 1970-01-01
      • 2021-12-28
      • 2019-03-13
      • 2020-10-07
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多