Dart解析含嵌套JSON字符串的JSON时遇FormatException错误求助
Dart解析JSON触发FormatException:Unexpected character问题解决
你的JSON解析失败是因为Dart字符串的转义处理导致最终的JSON格式非法。具体来说,你在普通三重单引号字符串里写的\"会被Dart解析为字面量",使得draft字段的字符串内容中的双引号没有被正确转义,破坏了JSON结构。
解决方案
有两种方法可以修复这个问题:
方法一:使用Dart原始字符串(Raw String)
在三重单引号前添加r,让Dart不处理字符串内的转义字符,这样\"会被完整保留到最终的JSON中,符合JSON的转义规则。方法二:双重转义反斜杠
在普通三重单引号字符串里,用\\"代替\",第一个反斜杠用于Dart字符串的转义,第二个反斜杠作为JSON的转义字符,确保最终JSON中的双引号被正确转义。
修正后的代码示例
方法一:原始字符串实现
import 'dart:convert'; void main() { // 使用原始字符串(r''' ... ''')保留转义字符 String jsonString = r''' { "status": "success", "data":{ "edit": 1, "draft": "{\"id\":\"25863\",\"type\":\"ABC\"}" } } '''; try { Map<String, dynamic> decode = jsonDecode(jsonString) as Map<String, dynamic>; print(decode); // 若需解析draft字段内的JSON字符串 Map<String, dynamic> draftData = jsonDecode(decode['data']['draft']) as Map<String, dynamic>; print('Draft详情: $draftData'); } on FormatException catch (e) { print('error ${e.toString()}'); } }
方法二:双重转义实现
import 'dart:convert'; void main() { // 用双重反斜杠实现JSON转义 String jsonString = ''' { "status": "success", "data":{ "edit": 1, "draft": "{\\\"id\\\":\\\"25863\\\",\\\"type\\\":\\\"ABC\\\"}" } } '''; try { Map<String, dynamic> decode = jsonDecode(jsonString) as Map<String, dynamic>; print(decode); // 解析draft内的JSON字符串 Map<String, dynamic> draftData = jsonDecode(decode['data']['draft']) as Map<String, dynamic>; print('Draft详情: $draftData'); } on FormatException catch (e) { print('error ${e.toString()}'); } }
修复后,jsonDecode可以正常解析得到Map<String, dynamic>类型的数据。如果需要进一步解析draft字段内的嵌套JSON字符串,只需对decode['data']['draft']再次调用jsonDecode即可。
内容的提问来源于stack exchange,提问作者aaa111
相关产品推荐
相关产品推荐

