【问题标题】:Save json data (multiple items) into a map将 json 数据(多项)保存到地图中
【发布时间】:2019-05-06 19:04:56
【问题描述】:

我有一个从我的服务器获取的 json 文件,我想使用模型将数据保存到地图中,正确的方法是什么?

我创建了一个模型来解码 json 数据。我的 json 文件有一些“[]”,如果我使用另一个没有“[]”的 json 文件(单个项目)它可以工作,但不能使用括号。

这是我的模型

class RestoModel {
  // int id;
  String name;
  RestoModel(this.name);

  RestoModel.fromJson(Map<String, dynamic> data) {
    name = data['name'];
  }
}

我的获取函数

  List<RestoModel> restaurantList = [];

  void fetchRestaurants() async {
    var response = await get('https://link/get_list.php');
    var data = RestoModel.fromJson(json.decode(response.body));
    setState(() {
      restaurantList.add(data);
      print(response.body);
    });
  }

我收到这个错误

Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'

这是我的 json 数据

[{"id":"1","name":"Resto 1"},{"id":"3","name":"Resto 2\r\n"}]

但我的代码可以处理这个 json 数据

{
  "name": "beatae et provident et ut vel",
}

我希望将 json 文件保存在列表中,但出现此错误

Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    {"id":"1","name":"Resto 1"} 是地图,[{"id":"1","name":"Resto 1"},{"id":"3","name":"Resto 2\r\n"}] 是地图列表。所以基本上当你解码你的 json 时,你最终得到了模型列表,id:1 和 id:2。您正在尝试将动态列表提供给您的命名构造函数,该构造函数将单个 Map 作为参数,而不是它们的列表。

    试试这个:

      Iterable i = json.decode(response.body);
      List<RestoModel> restaurantList = i.map((model) => RestoModel.fromJson(model)).toList();
    

    在这段代码中,我有一个可迭代对象,并且对于该可迭代对象中的每个餐厅数据,我都从 json 创建恢复模型。

    【讨论】:

    • 谢谢,它的工作不再出错了,但是当我打印 restaurantList 我得到这个消息``` ['RestoModel'的实例,'RestoModel'的实例]```不是实际数据跨度>
    • 是的,因为它是 RestoModel 的实例。你期待什么?您可以使用 restaurantList[0].name 访问数据,其中 0 是列表的索引。当您打印类的实例时,它会打印“ClassName”的实例,它永远不会传播对象的所有属性,除非您告诉它这样做:)
    • 没关系,它工作正常 :) 谢谢你 mirkancal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2015-10-23
    • 2012-08-25
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多