Dart如何将不带引号的键值对字符串转换为合法JSON或键值对
问题原因
- Dart内置的
json.decode仅支持严格JSON格式,要求字符串类型的键、值必须用双引号包裹,你输入的字符串属于JavaScript对象字面量格式,不符合JSON规范,因此直接解析会抛出_ChunkedJsonParser.fail相关错误。 json.encode的作用是将Dart对象序列化为JSON字符串,无法修复非法JSON格式的问题,因此预处理无效。
解决方案
方案1:正则预处理(适合简单场景)
适用范围
- 键、值均由字母、数字、下划线组成,无空格、冒号、大括号等特殊字符
- 无复杂嵌套结构
实现代码
import 'dart:convert'; void main() { var str = "[{key1: val1, key2: val2}, {key1: val1, key2: val2}, {key1: val1, key2: val2}]"; // 给所有键添加双引号:匹配冒号前的合法标识符 String processedStr = str.replaceAllMapped(RegExp(r'(\w+)(?=\s*:)'), (match) => '"${match.group(1)}"'); // 如果value是字符串类型,需要再加这一步给value加双引号,否则仍然不符合JSON规范 processedStr = processedStr.replaceAllMapped(RegExp(r'(?<=:\s*)(\w+)(?=\s*[,}])'), (match) => '"${match.group(1)}"'); // 处理后即可正常解码 final result = jsonDecode(processedStr); print(result); }
方案2:使用JSON5解析库(推荐,适配全场景)
JSON5是JSON的超集,原生支持无引号键、单引号、注释等宽松格式,不需要自行处理字符串。
实现步骤
- 在
pubspec.yaml中添加JSON5解析依赖 - 直接调用对应解析方法即可
实现代码
import 'package:json5/json5.dart'; void main() { var str = "[{key1: val1, key2: val2}, {key1: val1, key2: val2}, {key1: val1, key2: val2}]"; final result = json5Decode(str); print(result); }
方案3:自定义语法解析(适合极端特殊场景)
如果输入字符串有自定义特殊格式,以上两种方案都无法适配,可以手动遍历字符串字符,逐位拆分出键、值、分隔符,手动构建List<Map>结构即可。
内容的提问来源于stack exchange,提问作者Shashank Gb
相关产品推荐
相关产品推荐

