【问题标题】:Creating a list from JSON in Flutter在 Flutter 中从 JSON 创建一个列表
【发布时间】:2019-09-26 17:50:49
【问题描述】:

按照在线示例,我有以下代码:

_fetchData() async {
    setState(() {
      isLoading = true;
    });

    final response = await http.get(
        "https://apiurl...");

    if (response.statusCode == 200) {
      print(json.decode(response.body).runtimeType); // _InternalLinkedHashMap<String, dynamic>

      list = (json.decode(response.body) as List)
          .map((data) => Model.fromJson(data))
          .toList();

      setState(() {
        isLoading = false;
      });
    } else {
      throw Exception('Failed to load');
    }
  }

返回此错误:

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

这是来自 API 的响应:

{"results":[{"docid":"123434","title":"A title"}, ...]}

型号:

class Model {
  final String title;
  final String docid;

  Model._({this.title, this.docid});

  factory Model.fromJson(Map<String, dynamic> json) {
    return new Model._(
      title: json['title'],
      docid: json['docid'],
    );
  }
}

我知道上面的工厂期望参数是Map&lt;String, dynamic&gt; 并且json的格式不同并且可以更改,但是想知道如何使它与这种格式一起工作。

*** 编辑

工作列表视图

body: Column(
    children: <Widget>[
      Padding(
        padding: EdgeInsets.all(10.0),
        child: TextField(
          onChanged: (value) {
            ...
          },
          controller: _searchController,
          decoration: InputDecoration(

          ...
          ),
        ),
      ),
      Expanded(
        child: SizedBox(
          height: 200.0,
          child: ListView.builder(
              itemCount: list.length,
              itemBuilder: (BuildContext context, int index) {
                return Text(list[index].title);
              }),
        ),
      )
    ],
  ),

【问题讨论】:

  • 尝试使用jsonDecode 而不是json.decode
  • 在此行 json.decode(response.body) as List,请尝试使用 json.decode(response.body) as List&lt;String, dynamic&gt; 并告诉我们。

标签: dart flutter


【解决方案1】:

print(json.decode(response.body).runtimeType) 打印_InternalLinkedHashMap 的原因是因为你的 json 的顶层确实是一张地图; {"results":[ 以大括号打开。

所以,json.decode(response.body) 不是一个列表,也不能转换为一个。另一方面,json.decode(response.body)['results'] 一个列表。

你需要:

  list = json.decode(response.body)['results']
      .map((data) => Model.fromJson(data))
      .toList();

【讨论】:

  • 您好,谢谢您的回答。 print(list) 返回[Instance of 'Model', Instance of 'Model', ...] 这是正确的吗?我似乎无法让 ListView 工作。也将其添加到问题中。
  • 那必须是list[index].title。您的列表现在可以正确打印出您有多个模型。将索引索引到列表中,为您提供一个模型,然后您可以通过名称访问成员变量并使用点。
  • 我确定我尝试过使用 dot,但我会再看一遍。谢谢
  • 我编辑了我的问题,显示了我想如何使用 ListView 小部件。 Flutter 正在返回此消息:flutter: Another exception was thrown: RenderBox was not laid out: RenderViewport#67a95 NEEDS-LAYOUT NEEDS-PAINT
  • 在这里找到答案:stackoverflow.com/questions/52801201/…。似乎 ListView 小部件需要由 SizedBox 包装
【解决方案2】:

我试过这样,效果很好

List<UserModel> users = (json.decode(response.body) as List)
      .map((data) => UserModel.fromJson(data))
      .toList();

我的 Json 响应是这样的:-

[{"id":4,"name":"1","email":"admin","password":"dc4b79a9200aa4630fee652bb5d7f232c503b77fb3b66df99b21ec3ff105f623","user_type":"1","created_on":"2020-01-13 12:50:28","updated_on":"2020-01-14 11:42:05","flags":"00000"},{"id":31,"name":"avi","email":"asdf@gmail.com","password":"dc4b79a9200aa4630fee652bb5d7f232c503b77fb3b66df99b21ec3ff105f623","user_type":"1","created_on":"2020-03-15 11:39:16","updated_on":"2020-03-15 11:39:16","flags":null}]

【讨论】:

  • 我创建了一个模型类,但在尝试创建列表时没有调用任何内容。有没有办法在不创建类的情况下做到这一点?
【解决方案3】:

以下内容对我有用:

List<Model>.from(
  json.decode(response.body)
  .map((data) => Model.fromJson(data))
)

【讨论】:

    【解决方案4】:

    以下解决此代码并正常工作:

    最终响应 = 等待 http.get("https://about.google/static/data/locations.json");

    最终数据 = jsonDecode(response.body)['offices'];

    【讨论】:

      【解决方案5】:

      以上都不适合我 这是我的解决方案。

       List<dynamic> jsonResponse = json.decode(response.body);
       List<ActiveOrderData> mReturnVal = [];
       jsonResponse.map((element) {mReturnVal.add(new ActiveOrderData.fromJson(element));}).toList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 2021-09-16
        相关资源
        最近更新 更多