Flutter:如何映射嵌套的 json 对象

Posted

技术标签:

【中文标题】Flutter:如何映射嵌套的 json 对象【英文标题】:Flutter: How to map a nested json object 【发布时间】: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;

  

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

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

【问题讨论】:

这段代码比你的代码短一点,更简单,更安全。 ***.com/a/66766024/1737201 【参考方案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

【讨论】:

以上是关于Flutter:如何映射嵌套的 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在Dart / flutter中映射和显示嵌套的JSON?

如何将具有嵌套对象的复杂 json 文件映射到 java 对象?

如何将复杂(嵌套)对象解析为 JSON 并在 Flutter 中使用 HTTP 将其发送到服务器?

如何设置映射输入的嵌套 JSON 数组对象的状态

如何将带有嵌套数组的 JSON 对象映射到打字稿模型中?

如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行