json - 在颤动中用数组解析复杂的JSON
问题描述
我想解析一个由数组组成的复杂 JSON API,它显示以下错误。API 有天气的详细信息,我想在控制台中显示时间和波高。
错误
E/flutter ( 5675): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>'
E/flutter ( 5675): #0 _JsonDemoState.getJsonData
package:bottom_nav/APISample/JsonParsing.dart:25
E/flutter ( 5675): <asynchronous suspension>
E/flutter ( 5675):
这是我需要解析的 json。
{
"hours": [
{
"time": "2021-03-23T00:00:00+00:00",
"waveHeight": {
"icon": 1.35,
"meteo": 1.25,
"noaa": 0.97,
"sg": 1.25
}
},
{
"time": "2021-03-23T01:00:00+00:00",
"waveHeight": {
"icon": 1.36,
"meteo": 1.26,
"noaa": 0.97,
"sg": 1.26
}
}
]
}
这是解析json的函数
void getJsonData() async {
String url2 =
'https://api.stormglass.io/v2/weather/point?lat=5.9774&lng=80.4288¶ms=waveHeight&start=2021-03-23&end=2021-03-24';
String apiKey =
'the API key';
Response response = await get(Uri.parse(url2),
headers: {HttpHeaders.authorizationHeader: apiKey});
List data = jsonDecode(response.body);
data.forEach((element) {
Map obj = element;
String hours = obj['hours'];
Map wave = obj['waveHeight'];
int icon = wave['icon'];
print(icon);
});
}
解决方案
response.body 的 JSON 反序列化将返回 Map 而不是 List,因此可以选择访问与“hours”键关联的值并将其转换为 Map 的 List,键为 String 类型,值为 dynamic。
final mapList = data['hours'] as List<Map<String, dynamic>>;
mapList.forEach((item) => print(item.values.last['icon']));
推荐阅读
- javascript - Unexpected behavior when repeatedly calling map.setZoom with the same zoom level (Leaflet.js)
- bash - What does ENV=${deploy-qa} mean in bash? How does it evaluate to "qa"?
- c - 将 printf 放在哪里进行输出
- amazon-web-services - 测试集群自动扩展和过度配置是否按预期工作 k8s AWS
- docker - 在 Docker 运行命令中找不到 Pandas [附加卷]
- python - Counting words on multiple web pages at the same domain
- mysql - I cannot connect to my MySQL database in C with CLion
- python - 从 Jupyter 复制输出以粘贴到 Excel 中的简单方法
- linux - Reading and modifying data of syscall with ptrace
- angular - 等待来自父母的数据