
本文详解在非标准字符串转 json 场景下,当字段值(如 body)本身含逗号时,如何避免误解析为键值对分隔符,通过合理添加引号与转义确保语义完整性和结构合法性。
本文详解在非标准字符串转 json 场景下,当字段值(如 body)本身含逗号时,如何避免误解析为键值对分隔符,通过合理添加引号与转义确保语义完整性和结构合法性。
在实际开发中,我们偶尔会遇到“伪 JSON”字符串——即形似 JSON 但不符合 RFC 8259 规范的键值对格式(如用等号 = 分隔、未给字符串加引号)。这类字符串若直接替换 = 为 : 后解析,极易因值中含逗号(,)导致解析器错误切分字段,从而破坏原始语义。
例如原始字符串:
String strJSON = "{items=[{id=1647, address=sample, person=null, date=1686616249817, read=0, status=-1, type=1, subject=null, body=registration done successful, click on this to know more, serviceCenter=+910000000000}], total=1570}";其中 body 的真实值是 "registration done successful, click on this to know more",但因缺失双引号,解析器将逗号视作字段分隔符,错误地把 click on this to know more 识别为新字段名,serviceCenter 被吞并进前一字段,最终生成错误结构。
✅ 正确做法是:在预处理阶段,为所有字符串值显式添加双引号,并对内部双引号或特殊字符进行转义。关键步骤如下:
- 手动补全引号:对 body= 后的内容(直到下一个逗号或右括号前)整体包裹双引号;
- 转义引号:若值本身含双引号(如 body="He said \"OK\""),需用 \" 转义;
- 严格区分分隔符层级:JSON 中逗号仅用于分隔同级键值对或数组元素,绝不能出现在未引号包裹的字符串内部。
修正后的安全写法示例:
String strJSON = "{items=[{id=1647, " +
"address=sample, " +
"person=null, " +
"date=1686616249817, " +
"read=0, " +
"status=-1, " +
"type=1, " +
"subject=null, " +
"body=\"registration done successful, click on this to know more\", " + // ← 关键:加引号 + 转义(此处无需转义因无双引号)
"serviceCenter=+910000000000}], " +
"total=1570}"
.replaceAll("=", ":"); // 替换等号后仍需确保引号存在
System.out.println(JsonPath.parse(strJSON).jsonString());⚠️ 注意事项:
- JsonPath.parse() 依赖底层 JSON 解析器(如 Jackson 或 Gson),它严格遵循 JSON 语法——所有字符串必须用双引号包裹,单引号非法;
- 单纯 replaceAll("=", ":") 无法解决结构歧义,必须配合引号补全;
- 若数据源不可控(如第三方日志/配置),建议改用正则提取键值对并逐字段安全转义,或优先推动对方提供标准 JSON;
- 调试时可用 JSONLint 验证中间结果,确保无语法错误。
总结:逗号在 JSON 中是结构性符号,而非内容符号。当值含逗号时,唯一合规解法是将其置于双引号内——这是 JSON 规范的硬性要求,而非编码技巧。养成“字符串必引号、引号必转义”的习惯,可从根本上规避此类解析陷阱。


















