
本文介绍在 Java 中修复因反斜杠 或双引号 " 未正确转义而导致的无效 JSON 字符串的方法,涵盖行级解析、智能字符串清洗、安全转义策略及注意事项,适用于无法控制数据源时的接收端容错处理。
本文介绍在 java 中修复因反斜杠 `` 或双引号 `"` 未正确转义而导致的无效 json 字符串的方法,涵盖行级解析、智能字符串清洗、安全转义策略及注意事项,适用于无法控制数据源时的接收端容错处理。
JSON 规范严格要求字符串中的特殊字符(如 "、、控制字符等)必须被正确转义。当数据库 CLOB 字段返回类似 {"appName": "Sample "App " Name"} 这类非法 JSON(含裸露的未转义双引号或孤立反斜杠)时,标准解析器(Gson、Jackson)会直接抛出 MalformedJsonException —— 因为语法已破坏,任何“简单 replace”都无法普适修复:盲目全局替换 " 为 " 可能误伤键名、嵌套结构或已合法转义的部分;而 StringEscapeUtils.escapeJson() 等工具面向「合法字符串内容」而非「非法 JSON 文本」,故不适用。
✅ 推荐方案:结构感知的逐行清洗(PoC 实现)
核心思路是避免正则硬匹配复杂嵌套结构,转而利用 JSON 的基础语法规则(如 : 分隔键值、{ } [ ] 定义容器)进行轻量级格式化与上下文感知清洗:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 预格式化:插入换行分隔结构符号,使每行聚焦单一逻辑单元(键值对或容器边界);
-
行级处理:仅对形如
key: value的行提取 value 部分,剥离首尾引号后,安全移除非法并转义所有"; - 重建 JSON:拼接清洗后的键值对,再交由标准解析器验证/美化。
以下是可直接运行的 Java 示例(基于 Gson):
import com.google.gson.*;
import java.util.Scanner;
import java.util.regex.Pattern;
public class JsonRepair {
public static String repairCorruptJson(String corruptJson) {
// Step 1: 标准化空白与结构分隔(增强可读性,便于行处理)
String normalized = corruptJson
.replaceAll("\s*:\s*", ":") // 压缩键值分隔符周围的空格
.replaceAll("([\{\},\[\]])", "
$1
"); // 用换行包裹结构符号
StringBuilder cleaned = new StringBuilder();
try (Scanner scanner = new Scanner(normalized)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine().trim();
if (line.isEmpty() || line.matches("[\{\},\[\]]")) {
cleaned.append(line).append("
");
continue;
}
// 匹配 key: "value" 或 key: value 形式(支持无引号 value,但本场景主要处理字符串)
int colonIdx = line.indexOf(':');
if (colonIdx > 0 && line.length() > colonIdx + 1) {
String key = line.substring(0, colonIdx).trim();
String value = line.substring(colonIdx + 1).trim();
// 仅对字符串值做清洗:移除首尾引号 → 清理非法 → 转义所有 "
if (value.startsWith(""") && value.endsWith(""")) {
String unquoted = value.substring(1, value.length() - 1);
String safeValue = unquoted
.replace("\", "") // 移除所有裸露反斜杠(假设无真实转义需求)
.replace(""", "\""); // 转义所有双引号
cleaned.append(key).append(":"").append(safeValue).append(""
");
} else {
cleaned.append(line).append("
"); // 非字符串值保持原样
}
} else {
cleaned.append(line).append("
");
}
}
}
// Step 2: 使用 Gson 解析清洗后文本(验证合法性并输出规范 JSON)
try {
JsonElement parsed = JsonParser.parseString(cleaned.toString());
return new GsonBuilder().setPrettyPrinting().create()
.toJson(parsed);
} catch (JsonParseException e) {
throw new IllegalArgumentException("Failed to repair JSON: " + e.getMessage(), e);
}
}
// 使用示例
public static void main(String[] args) {
String corrupt = "{"appName": "Sample \ "App " Name", "foo": "Bar App \ "Name",
" +
" "test":[{"a": "b"}]}";
System.out.println(repairCorruptJson(corrupt));
}
}⚠️ 关键注意事项
-
这不是通用 JSON 修复器:该方案假设错误集中于字符串值内的
"和,且 JSON 整体结构(括号匹配、键值对分布)基本完好。若存在严重语法断裂(如缺失}、乱序]),需引入更重的解析器(如 ANTLR)或人工规则兜底。 -
反斜杠处理需谨慎:示例中直接
replace("\", "")是因业务场景确认无真实转义意图(如路径、正则)。若需保留有效转义(如),应改用状态机识别\"、\uXXXX等合法序列,仅修复非法单。 -
其他需关注字符:除
"和外,JSON 字符串中还禁止未转义的控制字符(U+0000–U+001F),如、、。若数据源可能含此类字符,应在清洗阶段统一替换为\t、\r、\n。 -
根本解法仍是源头治理:务必推动 DB 层使用
JSON.stringify()或PreparedStatement参数化写入,杜绝字符串拼接生成 JSON。
通过结构化清洗而非暴力正则,该方法在可控复杂度下显著提升接收端鲁棒性,让系统在数据质量波动时仍能维持基本可用性。

















