Flutter解析JSON报is not a subtype of type错误如何定位出错字段
Flutter JSON解析精准定位报错字段方案
你遇到的'String' is not a subtype of type 'Map<String, dynamic>'类型转换报错,不需要全量打印JSON逐字段比对,按下面的方案改就能直接拿到触发错误的键名:
手写fromJson解析场景
抽一个通用的字段取值方法,给每个字段的解析过程加错误捕获,出错时直接拼接当前字段名抛出即可,示例代码:
// 通用字段解析方法 T getJsonField<T>(Map<String, dynamic> json, String fieldKey) { try { return json[fieldKey] as T; } catch (originalError) { throw FormatException('parsing "$fieldKey" failed\n$originalError'); } }
所有字段解析都替换成调用这个方法,比如原来的写法:
country: Country.fromJson(json['country'] as Map<String, dynamic>)
改成:
country: Country.fromJson(getJsonField<Map<String, dynamic>>(json, 'country'))
嵌套模型只要每层都用这个方法取值,解析失败时会直接抛出你想要的精准报错,比如:
FormatException: parsing 'country' failed 'String' is not a subtype of type 'Map<String, dynamic>'
使用代码生成序列化库的场景
- 如果你用
json_serializable做序列化,6.0及以上版本生成的fromJson代码默认自带字段错误追踪,只要你不是自己写了强制类型转换覆盖逻辑,解析报错时会自动带上出错的字段名,不需要额外配置。 - 如果你用
freezed生成数据模型,默认抛出的解析错误会带完整的嵌套字段路径,比如user.address.city,定位嵌套结构的错误效率更高。
临时快速排查方法
如果不想改动现有解析逻辑,直接在最外层调用fromJson的位置套一层try-catch,捕获错误后查看错误栈,点击栈信息直接跳转到解析代码的报错行,该行对应的字段就是触发类型不匹配的字段,不需要逐行比对JSON内容。
内容的提问来源于stack exchange,提问作者Mo Elsifi
相关产品推荐
相关产品推荐

