You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java端修正含未转义特殊字符的无效JSON

问题背景

数据源(数据库)的某一列返回CLOB类型数据,该数据本应是合法JSON,多数情况下确实如此,但在某些场景下可能包含未转义的JSON特殊字符,如\或"。

示例:

{
  "appName": "Sample \ "App " Name"
}
核心问题

在数据源端修正问题或许是正确方案,但如果无法实现:

  • 如何在接收端(Java)修正包含未转义特殊字符的无效JSON?
  • 可以通过String replaced = sourceJson.replace("\\", "\\\\");处理\,但"该如何处理?
  • 如果只能手动替换,除了\、"之外,还有哪些字符需要按此方式替换?
已尝试的方案
  • 使用org.apache.commons.lang3.StringEscapeUtils转义源JSON后反序列化
String escapeJson = StringEscapeUtils.escapeJson(sourceJson);
Gson gson = new Gson();

MyObject obj = gson.fromJson(escapeJson, MyObject.class);
// 抛出异常:com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.appName=null
  • 使用com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString处理后反序列化
String quotedJson = String.valueOf(JsonStringEncoder.getInstance().quoteAsString(sourceJson));

Gson gson = new Gson();
MyObject obj = gson.fromJson(quotedJson, MyObject.class);
// 抛出异常:com.google.gson.stream.MalformedJsonException: Expected name at line 1 column 2 path $.appName=null
  • 与方案1相同,但使用ObjectMapper反序列化
String escapeJson = StringEscapeUtils.escapeJson(sourceJson);

ObjectMapper objectMapper = JsonMapper.builder()
          .enable(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER,
              JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
          .build();
MyObject obj = objectMapper.readValue(escapeJson, MyObject.class);
// 抛出异常:Unexpected character ('\' (code 92)): was expecting double-quote to start field name
  • 与方案2相同,但使用ObjectMapper反序列化
String quotedJson = String.valueOf(JsonStringEncoder.getInstance().quoteAsString(sourceJson));

ObjectMapper objectMapper = JsonMapper.builder()
          .enable(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER,
              JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
          .build();
MyObject obj = objectMapper.readValue(escapeJson, MyObject.class);
// 抛出异常:Unexpected character ('\' (code 92)): was expecting double-quote to start field name
研究推论
  • 查阅多篇Stack Overflow帖子,但均讨论在数据源端转义字符串的方案
  • 目前想到的接收端可行方案是通过正则表达式手动替换字符,替换单个\较为简单(正则表达式可能为\\),但不知如何替换单个/未终止的"

内容的提问来源于stack exchange,提问作者Cyriac George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 19:17:28