Flutter中如何解码格式无效的字符串化JSON
Flutter 解析无引号非标准JSON字符串实现方案
你拿到的字符串属于不符合RFC规范的非标准JSON:标准JSON要求对象键、字符串类型值必须用双引号包裹,直接调用内置jsonDecode会抛出格式解析异常,需要先对字符串做规则修正,转成合法JSON后再解码。
实现步骤
- 剥离原始字符串最外层多余的包裹双引号,拿到核心类JSON结构串
- 通过正则匹配,给所有未加引号的对象键、字符串值补上双引号,兼容数组内带空格的字符串值
- 对修正后的合法JSON字符串调用标准解码方法,拿到结构化的Dart对象
可直接复用的代码示例
import 'dart:convert'; void parseNonStandardJson() { // 原始待解析字符串 const rawStr = '"[{division: bacteriology, speciality: microbiology, tests: [appearence of urine], category: urine}]"'; // 1. 移除最外层多余的包裹引号 String tempStr = rawStr.substring(1, rawStr.length - 1); // 2. 正则补全双引号:匹配所有语法符号间的键、字符串值,自动包裹双引号 tempStr = tempStr.replaceAllMapped( RegExp(r'(?<=[:{,\[])\s*([a-zA-Z0-9\s]+?)\s*(?=[,:\]\}])'), (match) => '"${match.group(1)!.trim()}"' ); // 3. 标准JSON解码 final parsedResult = jsonDecode(tempStr); // 此时parsedResult为List<Map<String, dynamic>>类型,可直接取值操作 print(parsedResult[0]['division']); // 输出 bacteriology print(parsedResult[0]['tests']); // 输出 [appearence of urine] }
适配注意事项
- 如果待解析内容包含数字、布尔类型值,需要调整正则匹配规则,避免给非字符串类型值错误包裹引号导致类型解析异常
- 如果字符串值中包含冒号、逗号、方括号/花括号这类JSON语法符号,上述正则需要额外增加边界判断,避免匹配错位
- 正则替换完成后建议先打印临时字符串校验格式,确认所有键值都正确包裹双引号后再执行解码,减少格式错误排查成本
内容的提问来源于stack exchange,提问作者user10675368
相关产品推荐
相关产品推荐

