嵌套未转义JSON字符串解码遇Format Exception,求解决方法
解决未转义嵌套JSON字符串的解码问题
问题原因
你遇到的格式异常,是因为mat_attributes字段的嵌套JSON字符串未正确转义双引号——外层JSON解析时,会把嵌套JSON里的双引号当成外层字符串的结束标记,直接触发语法错误。
解决方案
方案1:修复源JSON(推荐)
如果能控制生成这段JSON的上游服务,直接将mat_attributes中的嵌套JSON双引号转义(把"替换为\")。修正后的字段示例:
"mat_attributes": "[{\"mat_attribute_id\":\"6904982A-EBA6-4A31-8D38-3B688ADB9D4E\",\"mat_attribute_name\":\"Test2\",\"mat_attribute_desc\":\"Test2\",\"material_id_guid\":\"6A895CC4-4093-4693-85F4-C65693FEB45F\",\"material_id\":\"1194\"},...]"
修正后直接用jsonDecode(result)完成外层解析,之后再对mat_attributes的字符串值执行二次解码:
List decoded = jsonDecode(result); for (var item in decoded) { if (item['mat_attributes'].isNotEmpty) { item['mat_attributes'] = jsonDecode(item['mat_attributes']); } }
方案2:预处理字符串(无法修改源JSON时使用)
若无法修改上游生成的JSON,可在解析前通过正则匹配mat_attributes的内容,转义其中的双引号:
// 预处理JSON字符串,修复嵌套JSON的转义问题 String processedResult = result.replaceAllMapped( RegExp(r'"mat_attributes":\s*"([^"]+)"'), (match) { String nestedContent = match.group(1)!; String escapedContent = nestedContent.replaceAll('"', '\\"'); return '"mat_attributes": "$escapedContent"'; }, ); // 执行正常解码 List decoded = jsonDecode(processedResult); // 二次解码mat_attributes字段 for (var item in decoded) { if (item['mat_attributes'] is String && item['mat_attributes'].isNotEmpty) { item['mat_attributes'] = jsonDecode(item['mat_attributes']); } }
注意:该正则方案适用于当前案例的简单结构,若嵌套JSON包含复杂转义逻辑,可能需要更严谨的字符串处理逻辑。
内容的提问来源于stack exchange,提问作者Dowlpack
相关产品推荐
相关产品推荐

