如何使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
相关产品推荐
相关产品推荐

