Java中如何对JSON字符串内嵌套的未转义双引号做转义处理
服务端处理JSON未转义嵌套双引号解决方案
是可以在服务端自行完成转义操作的,但由于这类不符合JSON规范的输入没有统一的解析标准,需要结合你业务的实际数据规则做适配,避免误转。
核心原理
你给出的示例中,合法的JSON结构性双引号(用来包裹键名、值边界的引号)后面,必然紧跟三种字符(中间可能有空白符):
- 键名后的双引号后面跟
: - 非末尾值后的双引号后面跟
, - 末尾值后的双引号后面跟
}
只要识别出不属于上述情况的双引号,就是值内部需要转义的嵌套引号,加上反斜杠转义即可得到合法JSON。
两种Java端可行实现方案
方案1:自定义正则预处理(轻量适配)
直接对输入的非法JSON字符串做正则匹配替换,识别出嵌套双引号做转义,示例代码如下:
/** * 修复非标准JSON中未转义的嵌套双引号 * @param invalidJson 输入的非法JSON字符串 * @return 符合规范的JSON字符串 */ public static String fixNestedQuotes(String invalidJson) { // 匹配后面不是结构性字符的双引号,添加转义符 return invalidJson.replaceAll("\"(?=\\s*[^:,}])", "\\\\\""); }
你给出的示例输入经过该方法处理后,会输出符合规范的JSON:{"id":"101","user":"username","comment":"Example: \"Comment: 123\" test" }
可直接被Jackson、Gson等常规JSON解析库解析。
注意:该方案仅适用于业务值内部不会出现双引号后紧跟
, : }的场景,如果你的业务数据存在这类特殊格式,需要调整正则规则。
方案2:使用宽松模式的JSON解析库(优先推荐)
不需要自己编写预处理逻辑,直接开启主流JSON解析库的宽松解析模式,即可自动兼容未转义的嵌套双引号:
Jackson配置示例
ObjectMapper objectMapper = new ObjectMapper(); // 开启宽松解析,兼容未转义引号等非标准格式 objectMapper.enable(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS); objectMapper.enable(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER); objectMapper.configure(DeserializationFeature.FAIL_ON_TRAILING_TOKENS, false);
Gson配置示例
// 开启宽松解析模式 Gson gson = new GsonBuilder().setLenient().create();
该方案容错性更高,不需要针对业务规则做额外适配,是首选方案。
注意事项
- 所有兼容逻辑上线前都需要用历史异常数据做充分测试,避免出现转义错误导致数据失真
- 服务端预处理只是临时兼容方案,如果条件允许还是建议推动数据提供方严格按照JSON规范输出数据,从根源解决问题
内容的提问来源于stack exchange,提问作者Erdem KESLI
相关产品推荐
相关产品推荐

