在 Flutter 中从 JSON 创建一个列表

Posted

技术标签:

【中文标题】在 Flutter 中从 JSON 创建一个列表【英文标题】:Creating a list from JSON in Flutter 【发布时间】: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; 并告诉我们。 【参考方案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 在这里找到答案:***.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();

【讨论】:

以上是关于在 Flutter 中从 JSON 创建一个列表的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter/Dart 中从 JSON 数组中提取数据

在 Python 中从 JSON 数据创建列表和字典 [重复]

如何在 Flutter 中从 JSON 中提取图像链接 - 正则表达式

在 Flutter 和 Dart 中从 JSON 解析双精度值

我们如何在 Flutter 中从 JSON 对象中获取特定数据?

如何在 Flutter 中从 API 获取 JSON 数据