
本文讲解如何将格式不规范的类 json 字符串(如键值对间用等号、值中含未引号包裹的逗号)安全转换为标准 json,重点解决因逗号导致字段解析错位的问题。
本文讲解如何将格式不规范的类 json 字符串(如键值对间用等号、值中含未引号包裹的逗号)安全转换为标准 json,重点解决因逗号导致字段解析错位的问题。
在实际开发中,我们偶尔会遇到类似 {items=[{id=1647, address=sample, body=registration done successful, click on this to know more, serviceCenter=+910000000000}], total=1570} 这样的“伪 JSON”字符串——它并非合法 JSON,而是服务端或日志中输出的类 Map 格式文本。直接使用 .replaceAll("=", ":") 粗暴替换会导致解析失败:因为 body 值中的逗号被误识别为字段分隔符,从而将 "click on this to know more" 错误地解析为独立键名,serviceCenter 被吞入前一字段。
✅ 正确做法是:先确保所有字符串值用双引号包裹,并对内部双引号进行转义,再统一替换等号为冒号。例如:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
String strJSON = "{items=[\n" +
"{id=1647,\n" +
"address=\"sample\",\n" +
"person=null,\n" +
"date=1686616249817,\n" +
"read=0,\n" +
"status=-1,\n" +
"type=1,\n" +
"subject=null,\n" +
"body=\"registration done successful, click on this to know more\",\n" +
"serviceCenter=\"+910000000000\"}],\n" +
"total=1570}";
// 注意:仅替换未被引号包裹的等号(此处为简化,假设结构固定)
String jsonLike = strJSON.replaceAll("=", ":");
String validJson = JsonPath.parse(jsonLike).jsonString();
System.out.println(validJson);
⚠️ 关键注意事项:
- JSON 规范要求:所有字符串键和字符串值必须用双引号(")包围,单引号或无引号均非法;
- 字符串内若含双引号,需写成 \";若含换行/制表符等,也应转义;
- replaceAll("=", ":") 是危险操作——它会破坏已引号包裹的字符串内的等号(如 URL 参数)。更健壮方案应使用正则匹配「非引号内」的等号,或借助 StringTokenizer / 自定义解析器;
- 推荐优先推动上游系统输出标准 JSON;若无法修改源头,建议封装一个轻量级 LooseJsonParser 工具类,基于状态机识别引号边界后再拆分。
总结:逗号在 JSON 中是结构分隔符,而非内容一部分;解决核心在于显式界定字符串边界。遵循 JSON 语法规范(参考教程),比依赖字符串替换更可靠、可维护。










