Jackson ObjectMapper writeValueAsBytes额外添加反斜杠问题的解决咨询
Jackson序列化反斜杠的问题解析与解决办法
这个问题我之前也碰到过,其实是Jackson严格遵循JSON规范的默认行为导致的——在JSON语法里,反斜杠\是特殊转义字符,必须写成\\才能被JSON解析器正确识别,所以Jackson默认会帮你把字符串里的单个反斜杠转成双反斜杠,确保生成的JSON是合法的。
但如果你的业务场景确实不需要这种转义(比如要生成非标准的自定义格式),可以通过以下几种方式实现需求:
方法1:全局配置ObjectMapper禁用反斜杠转义
你可以直接修改ObjectMapper的配置,关闭反斜杠的自动转义功能。注意不同Jackson版本的配置项略有区别:
public static void main(String[] args) throws JsonProcessingException, UnsupportedEncodingException { ObjectMapper mapper = new ObjectMapper(); // Jackson 2.10及以上版本用这个配置 mapper.disable(JsonGenerator.Feature.ESCAPE_BACKSLASH); // 如果你用的是更新的Jackson版本,也可以尝试WriterFeature: // mapper.disable(WriterFeature.ESCAPE_BACKSLASH); Map<String, String> data = new HashMap<>(); data.put("id", "Test\\String"); System.out.println("data[id] that has single backslash: " + data.get("id")); byte[] dataInBytes = mapper.writeValueAsBytes(data); System.out.println("data in bytes without double backslash: " + new String(dataInBytes, "UTF-8")); // 此时输出会是:{"id":"Test\String"} }
方法2:针对单个字段使用@JsonRawValue注解
如果你不想全局修改配置,只想让某个特定字段输出原始字符串(不转义),可以给该字段加上@JsonRawValue注解:
// 先定义一个实体类 class Data { @JsonRawValue private String id; // 生成getter和setter方法 public String getId() { return id; } public void setId(String id) { this.id = id; } } // 测试代码 public static void main(String[] args) throws JsonProcessingException, UnsupportedEncodingException { ObjectMapper mapper = new ObjectMapper(); Data data = new Data(); data.setId("Test\\String"); byte[] dataInBytes = mapper.writeValueAsBytes(data); System.out.println(new String(dataInBytes, "UTF-8")); // 输出:{"id":"Test\String"} }
重要提醒
需要注意的是,禁用反斜杠转义后生成的内容不再是标准JSON,因为单个反斜杠在JSON中属于非法字符。如果后续这个字节数组需要用标准JSON解析器解析,会直接报错。所以只有当你确认接收方不需要按标准JSON处理,或者有自定义的解析逻辑时,才建议使用这些方法。
内容的提问来源于stack exchange,提问作者Abh Swar
相关产品推荐
相关产品推荐

