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

Dart解析List类型JSON报错:'List'不是'Map<String, dynamic>'子类型

错误分析与解决:'type 'List' is not a subtype of type 'Map<String, dynamic>'

一、JSON外的[]是什么意思

JSON里的[]代表这是一个JSON数组,也就是多个同结构JSON对象的集合。比如你拿到的接口响应大概率是这种结构:

[
  {"id": 1, "date": "2024-01-01", "name": "张三"},
  {"id": 2, "date": "2024-01-02", "name": "李四"}
]

和单个{}包裹的JSON对象是完全不同的数据类型。

二、错误原因

你的Post.fromJson方法要求传入Map<String, dynamic>(对应单个JSON对象),但你直接把整个接口响应传了进去——而接口返回的JSON数组解析后在Dart里是List<dynamic>类型,类型不匹配自然就抛出了这个错误。

你之前尝试“把Map转成List”完全搞反了逻辑:实际响应本身就是List,你需要把List里的每个元素(每个元素才是Map类型的单个对象)传给fromJson去解析。

三、解决方法

修改你的fetchPost方法,先把响应解析成List,再遍历List里的每个元素,逐个用Post.fromJson生成Post对象,最终得到一个List<Post>:

示例代码

// 你的Post类定义(参考)
class Post {
  final int id;
  final String date;
  final String name;

  Post({required this.id, required this.date, required this.name});

  factory Post.fromJson(Map<String, dynamic> json) {
    return Post(
      id: json['id'],
      date: json['date'],
      name: json['name'],
    );
  }
}

// 修改后的fetchPost方法
Future<List<Post>> fetchPost() async {
  final response = await http.get(Uri.parse('你的接口URL'));

  if (response.statusCode == 200) {
    // 将响应体解析为List<dynamic>
    List<dynamic> postJsonList = jsonDecode(response.body);
    // 遍历数组,把每个JSON对象转成Post实例
    return postJsonList.map((json) => Post.fromJson(json)).toList();
  } else {
    throw Exception('加载帖子失败');
  }
}

四、特殊情况处理

如果接口存在返回单个JSON对象({})的可能,你可以先判断解析后的数据类型再处理:

dynamic responseData = jsonDecode(response.body);
if (responseData is List) {
  // 按数组逻辑处理,返回List<Post>
} else if (responseData is Map) {
  // 按单个对象处理,比如返回[Post.fromJson(responseData)]
}

内容的提问来源于stack exchange,提问作者Fotis Psarris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:35:15