Flutter JSON解析报错:期望类型为List<dynamic>,实际获取到_JsonMap类型的问题求助
解决JSON解析时“Expected a value of type 'List', but got one of type '_JsonMap'”错误
看起来你踩了一个很常见的JSON解析坑——你假设API返回的是一个数组(List),但实际上它返回的是单个JSON对象(Map),这就是类型不匹配报错的核心原因。
问题分析
看你代码里的核心解析逻辑:
final json = response.body; List list = (jsonDecode(json) as List<dynamic>) ; final local = list.map<Localizacao>((map) => Localizacao.fromJson(map)).toList(); return Response(true, msg: "OK", result: local[0]);
这里你强行把jsonDecode的结果转成List,但你调用的CEP查询API返回的是单个地址对象(比如{"cep":"12345-678","logradouro":"某某大街",...}),并非数组格式,所以类型转换直接失败,抛出了类型不匹配的错误。
解决方案
直接把解析结果转成Map<String, dynamic>,然后用Localizacao.fromJson创建单个对象即可,完全不需要处理List:
修改后的核心代码片段:
if (response.statusCode == 200) { // 把解析结果转为Map类型,而非List final jsonData = jsonDecode(response.body) as Map<String, dynamic>; // 直接用单个Map创建Localizacao实例 final localizacao = Localizacao.fromJson(jsonData); return Response(true, msg: "OK", result: localizacao); }
额外调试建议
- 先确认API返回结构:可以先在代码里加一行
print(jsonDecode(response.body));,控制台输出的内容能直观告诉你返回的是对象还是数组,帮你快速定位问题。 - 优化异常排查:在
catch分支里打印具体异常信息print(e),不要只返回通用错误提示,这样能更精准地找到问题点。 - 处理字段安全:建议在
Localizacao.fromJson方法里对字段做非空判断(比如用?或者??),避免API返回缺失字段时出现空指针异常。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

