在 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<String, dynamic>
并且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<String, dynamic>
并告诉我们。
【参考方案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 解析双精度值