【问题标题】:Flutter: How to map a nested json objectFlutter:如何映射嵌套的 json 对象
【发布时间】:2021-06-20 02:25:27
【问题描述】:

我是 Flutter 新手,正在尝试将数据放入我的应用中的列表视图中。

我从网络服务器检索到这个 json 对象结构:

{
  "item_data1":
  {
    "index": 0, 
    "age": 39, 
    "picture": "http://placehold.it/32x32", 
    "name": "Sospeter", 
    "email": "sospeter@123.com"
  }, 
  "item_data2":
  {
    "index": 1, 
    "age": 49, 
    "picture": "http://placehold.it/32x32", 
    "name": "Eric", 
    "email": "mericr@123.com"
  }
}

注意:键“item_data1”和“item_data2”是动态的,不能在代码中预先确定。

您可以使用以下链接获取 json:http://www.json-generator.com/api/json/get/bUAhSFmhNK?indent=2

我的意图是 dart:convert 我项目中的 json。

到目前为止,我有这个:

Future<List<User>> _getUsers() async {

    var url = "http://www.json-generator.com/api/json/get/bUAhSFmhNK?indent=2"; //Obj
    var data = await http.get(url);

    var jsonData = json.decode(data.body);
    //print(jsonData.toString()); <-- returns data
    List<User> users = [];

    for(var u in jsonData){ <!-- breaks

      User user = User(u["index"], u["age"], u["name"], u["email"], u["picture"]);

      users.add(user);

    }

    //print(users.length);

    return users;

  }

如何安全地获取“姓名”、“电子邮件”等?

我被难住了。如果能得到任何帮助,我将不胜感激:)

【问题讨论】:

标签: json flutter dictionary object dart


【解决方案1】:

尝试改变
var jsonData = json.decode(data.body);

var jsonData = json.decode(data.body) as Map&lt;String, dynamic&gt;;

然后使用

 jsonData.forEach((k, v) => print("Key : $k, Value : $v"));

看看你有什么。

然后您应该能够使用以下代码填充您的用户对象并将其添加到列表中:

    User user = User(v["index"], v["age"], v["name"], v["email"], v["picture"]);
    users.add(user);

(我假设您的用户模型已设置为支持此功能)

【讨论】:

  • 越来越近了,但我还没到那一步。如何使用 forEach 进一步循环 $v 以获取“name”的值?
  • 我刚刚弄明白了... jsonData.forEach((k, v) {User user = User(v["index"], v["age"], v[" name"], v["email"], v["picture"]); users.add(user); });
【解决方案2】:

您可以使用 Object from json 方法。

https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51

它包含定义一个函数,该函数将解析传入的 json 并构建您的对象,当属性丢失时设置为 null。

【讨论】:

    【解决方案3】:

    另一种方式:

    import 'package:http/http.dart' as http;
    import 'package:json_helpers/json_helpers.dart';
    
    Future<void> main() async {
      final users = await _getUsers();
      print(users.first.name);
    }
    
    Future<List<User>> _getUsers() async {
      final url = 'http://www.json-generator.com/api/json/get/bUAhSFmhNK?indent=2';
      final response = await http.get(Uri.parse(url));
      final map = response.body.jsonMap((e) => User.fromJson(e));
      return map.values.toList();
    }
    
    class User {
      int age;
      int index;
      String email;
      String name;
      String picture;
    
      User({this.age, this.email, this.index, this.name, this.picture});
    
      factory User.fromJson(Map<String, dynamic> json) {
        return User(
          age: json['age'] as int,
          email: json['email'] as String,
          index: json['index'] as int,
          name: json['name'] as String,
          picture: json['picture'] as String,
        );
      }
    }
    

    输出:

    Eric
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 2020-02-19
      • 1970-01-01
      • 2021-03-29
      • 2020-09-27
      • 2013-08-01
      • 2021-05-25
      相关资源
      最近更新 更多