Flutter中Dart JSON解码遇类型不匹配错误,求解决方案
解决Dart JSON解码类型不匹配错误
错误原因
你遇到的错误是因为jsonDecode返回的列表元素类型为dynamic,但你在map回调里直接指定参数为Map,导致Dart无法完成类型匹配,触发类型转换异常。另外你的RicettaNew类未正确解析嵌套的values字段,代码还存在重复调用jsonDecode的冗余操作。
解决步骤
1. 完善数据模型类
首先定义Values类来解析JSON中的嵌套数组,同时修正RicettaNew的fromJson方法,完成values字段的解析:
class Values { String key; String value; Values(this.key, this.value); Values.fromJson(Map<dynamic, dynamic> json) { key = json["key"]; value = json["value"]; } } class RicettaNew { String name; List<Values> values = []; RicettaNew(this.name, this.values); RicettaNew.fromJson(Map<dynamic, dynamic> json) { name = json["name"]; // 解析values列表 if (json["values"] != null) { values = (json["values"] as List) .map((item) => Values.fromJson(item as Map<dynamic, dynamic>)) .toList(); } } }
2. 修正JSON解码代码
去掉重复的jsonDecode调用,调整map回调的参数类型,先接收dynamic再转为Map:
var serverlink = "http://207.154.221.255:8600/api/recipes" + "/" + mc.model; var request = http.Request('GET', Uri.parse(serverlink)); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { var result = await response.stream.bytesToString(); print("result: " + result); // 解析为List并处理类型转换 var jsonList = jsonDecode(result) as List; lista = jsonList.map((dynamic item) { return RicettaNew.fromJson(item as Map<dynamic, dynamic>); }).toList(); }
也可以用更简洁的写法:
lista = (jsonDecode(result) as List) .map((item) => RicettaNew.fromJson(item as Map<dynamic, dynamic>)) .toList();
这样即可解决类型不匹配的错误,同时完整解析JSON中的所有字段。
内容的提问来源于stack exchange,提问作者riki
相关产品推荐
相关产品推荐

