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
相关产品推荐
相关产品推荐

