Flutter从JSON API取数报错:_InternalLinkedHashMap无法转为List
Flutter JSON数据解析错误解决方案
错误原因
你直接将API返回的整个Map对象强制转换为List,但实际API返回的JSON结构是外层为Map,内部包含一个数组类型的字段,导致类型不匹配触发报错。
修复步骤
- 确认API返回的JSON结构(根据你提供的截图,外层是对象,数组数据对应某个具体键,比如
data或与变量名对应的akhbar)。 - 修改代码逻辑,从解析后的Map中取出对应的数组字段,而非直接转换整个Map。
修改后的代码示例
List _loadedAkhbar = []; Future<void> _fetchData() async { const apiUrl = 'myapi'; HttpClient client = HttpClient(); client.autoUncompress = true; final HttpClientRequest request = await client.getUrl(Uri.parse('$apiUrl/${widget.id}')); print('$apiUrl/${widget.id}'); request.headers .set(HttpHeaders.contentTypeHeader, "application/json; charset=UTF-8"); final HttpClientResponse response = await request.close(); final String content = await response.transform(utf8.decoder).join(); Map<String, dynamic> data = jsonDecode(content); setState(() { // 替换为你JSON中实际对应的数组键(比如截图里的具体键名) _loadedAkhbar = data['data'] as List; }); } @override void initState() { super.initState(); _fetchData(); }
额外优化建议
- 添加空值判断避免空指针异常:
setState(() { _loadedAkhbar = (data['data'] as List?) ?? []; }); - 推荐使用
http包简化网络请求,代码更简洁易维护:// 先在pubspec.yaml添加依赖:http: ^0.13.5 import 'package:http/http.dart' as http; Future<void> _fetchData() async { final response = await http.get( Uri.parse('$apiUrl/${widget.id}'), headers: {HttpHeaders.contentTypeHeader: "application/json; charset=UTF-8"}, ); if (response.statusCode == 200) { Map<String, dynamic> data = jsonDecode(response.body); setState(() { _loadedAkhbar = (data['data'] as List?) ?? []; }); } }
内容的提问来源于stack exchange,提问作者mohamed yassine
相关产品推荐
相关产品推荐

