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

如何使Jackson生成的JSON中\\u转为\u?

问题:如何将JSON中的\\u转换为\u?

示例代码及当前输出

public void run(String... args) throws Exception {
    final ObjectMapper jackson = new ObjectMapper();
    
    final ObjectNode objectNode = jackson.createObjectNode();
    String text = "Simplified Chinese 简体中文";
    
    final String escapedInUnicodeText = StringEscapeUtils.escapeJava(text);
    System.out.println(escapedInUnicodeText);
    // 输出结果: Simplified Chinese \u7B80\u4F53\u4E2D\u6587
    
    objectNode.put("text", escapedInUnicodeText);
    System.out.println(jackson.writeValueAsString(objectNode));
    // 输出结果: {"text":"Simplified Chinese \\u7B80\\u4F53\\u4E2D\\u6587"}
}

当前执行结果:

  • 执行System.out.println(escapedInUnicodeText);,输出为 Simplified Chinese \u7B80\u4F53\u4E2D\u6587
  • 执行System.out.println(jackson.writeValueAsString(objectNode));,输出为 {"text":"Simplified Chinese \\u7B80\\u4F53\\u4E2D\\u6587"}

解决方案

方法1:让Jackson直接处理原始字符串(推荐)

问题根源是你先用StringEscapeUtils.escapeJava手动转义了中文,Jackson序列化时又对反斜杠做了二次转义,导致出现\\u。直接将原始字符串传入ObjectNode,通过Jackson配置控制Unicode转义即可:

public void run(String... args) throws Exception {
    final ObjectMapper jackson = new ObjectMapper();
    // 开启非ASCII字符的Unicode转义
    jackson.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
    
    final ObjectNode objectNode = jackson.createObjectNode();
    String text = "Simplified Chinese 简体中文";
    
    objectNode.put("text", text); // 直接放入原始字符串
    System.out.println(jackson.writeValueAsString(objectNode));
    // 输出结果: {"text":"Simplified Chinese \u7B80\u4F53\u4E2D\u6587"}
}

方法2:禁用Jackson的反斜杠转义

如果必须保留手动转义的步骤,可配置Jackson禁止转义反斜杠:

public void run(String... args) throws Exception {
    final ObjectMapper jackson = new ObjectMapper();
    // 关闭反斜杠转义特性
    jackson.getFactory().configure(JsonGenerator.Feature.ESCAPE_BACKSLASH, false);
    
    final ObjectNode objectNode = jackson.createObjectNode();
    String text = "Simplified Chinese 简体中文";
    
    final String escapedInUnicodeText = StringEscapeUtils.escapeJava(text);
    objectNode.put("text", escapedInUnicodeText);
    System.out.println(jackson.writeValueAsString(objectNode));
    // 输出结果: {"text":"Simplified Chinese \u7B80\u4F53\u4E2D\u6587"}
}

方法3:事后替换JSON字符串

如果已经生成了带\\u的JSON,可通过字符串替换修正:

// 先得到带有双重转义的JSON字符串
String jsonWithDoubleEscape = jackson.writeValueAsString(objectNode);
// 替换所有的\\\\u为\\u
String correctedJson = jsonWithDoubleEscape.replace("\\\\u", "\\u");
System.out.println(correctedJson);
// 输出结果: {"text":"Simplified Chinese \u7B80\u4F53\u4E2D\u6587"}

方法对比

  • 方法1是最优方案,符合Jackson的设计逻辑,避免重复转义问题,无额外风险。
  • 方法2适合必须手动转义的场景,但全局禁用反斜杠转义可能影响其他需要转义的字符。
  • 方法3属于事后补救,仅适合无法修改序列化流程的情况,需注意如果JSON中有其他合法的\\,可能会被误替换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:47:05