You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter从JSON API取数报错:_InternalLinkedHashMap无法转为List

Flutter JSON数据解析错误解决方案

错误原因

你直接将API返回的整个Map对象强制转换为List,但实际API返回的JSON结构是外层为Map,内部包含一个数组类型的字段,导致类型不匹配触发报错。

修复步骤

  1. 确认API返回的JSON结构(根据你提供的截图,外层是对象,数组数据对应某个具体键,比如data或与变量名对应的akhbar)。
  2. 修改代码逻辑,从解析后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:39:40