
本文详解在非标准字符串格式(如键值对无引号、值含逗号)转为标准 JSON 时,如何避免因逗号被误解析为字段分隔符而导致结构错误,并通过手动预处理与引号转义确保 body 等含逗号的字符串值完整保留。
本文详解在非标准字符串格式(如键值对无引号、值含逗号)转为标准 json 时,如何避免因逗号被误解析为字段分隔符而导致结构错误,并通过手动预处理与引号转义确保 `body` 等含逗号的字符串值完整保留。
在实际开发中,我们常遇到类似 {items=[{id=1647, body=registration done successful, click on this to know more, serviceCenter=+910000000000}]} 这类伪 JSON 字符串——它并非合法 JSON,而是类 Java 属性风格的文本。直接使用 .replaceAll("=", ":") 粗暴替换会导致解析器将 body 值中的逗号误认为是对象字段分隔符,从而错误地将 "click on this to know more" 解析为新字段名,破坏原始语义。
要获得期望输出:
{"items":[{"id":1647,"body":"registration done successful, click on this to know more","serviceCenter":"+910000000000"}],"total":1570}
关键在于:先使输入文本符合 JSON 语法规范,再交由解析器处理。
✅ 正确做法:显式包裹字符串值并转义双引号
JSON 规范要求所有字符串必须用双引号(")包裹,且字符串内部若含双引号需转义为 "。因此,对于含逗号的 body 值,应将其整体用双引号包围,并对其中可能存在的引号进行转义:
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("=", ":")
.replaceAll("(\w+)\s*:", ""$1":"); // 补全 key 的双引号(可选增强)
// 使用 JsonPath 解析(需确保输入已为合法 JSON)
String validJson = JsonPath.parse(strJSON).jsonString();
System.out.println(validJson);
? 提示:上述 .replaceAll("(\w+)\s*:", ""$1":") 是进阶优化,用于自动为无引号的 key(如 id: → "id":)补上双引号,进一步提升兼容性。若原始字符串 key 已隐含规范(如部分库支持),可省略。
⚠️ 注意事项与最佳实践
- 不要依赖简单 replaceAll 处理复杂结构:仅替换 = 无法解决字段边界问题,尤其当值中含逗号、空格或嵌套结构时;
- 优先获取标准 JSON 源数据:与后端或数据提供方协商,改用 application/json 格式传输,从根本上规避解析风险;
- 若必须解析非标格式,请使用专用解析器:如 Apache Commons CSV(配合自定义分隔符)、正则分组提取,或编写状态机解析器,而非硬编码字符串替换;
- 验证 JSON 合法性:使用 JSONLint 或 org.json.JSONObject 构造器捕获 JSONException,确保转换结果可被下游系统安全消费。
总之,JSON 是严格语法驱动的格式,任何“看起来像 JSON”的字符串都不等于 JSON。尊重其语法规则——尤其是字符串引号与转义——才是可靠转换的基石。











