Jackson ObjectMapper writeValueAsBytes方法为已包含反斜杠的字符串添加另一个反斜杠

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jackson ObjectMapper writeValueAsBytes方法为已包含反斜杠的字符串添加另一个反斜杠相关的知识,希望对你有一定的参考价值。

如果我尝试将已包含反斜杠的字符串转换为字节数组,然后将该字节数组更改回字符串,则使用Jacksons的ObjectMapper,输出包含一个额外的反斜杠。以下代码显示了该问题

public static void main(String[] args) throws JsonProcessingException, UnsupportedEncodingException {
    ObjectMapper mapper = new ObjectMapper();
    Map<String, String> data = new HashMap<>();
    data.put("id", "Test\\String");

    //output: data[id] that has single backslash: Test\String
    System.out.println("data[id] that has single backslash: " + data.get("id"));

    byte[] dataInBytes = mapper.writeValueAsBytes(data);
    //output: data in bytes that contains double backslash: {"id":"Test\\String"}
    System.out.println("data in bytes that contains double backslash: " + new String(dataInBytes, "UTF-8"));
}

有没有办法配置ObjectMapper,以便mapper#writeValueAsBytes方法不会将字符串Test \ String更改为Test \\ String?有没有其他方法使用Jackson / ObjectMapper来实现这一目标?

提前致谢!!

答案

这是有效的行为。输出已转义为反斜杠。在JSON中,反斜杠必须被转义。

换句话说,{"id":"Test\String"}不是有效的JSON。

检查this是否有必须在JSON中转义的其他字符。

以上是关于Jackson ObjectMapper writeValueAsBytes方法为已包含反斜杠的字符串添加另一个反斜杠的主要内容,如果未能解决你的问题,请参考以下文章

jackson中objectMapper的使用

导入 com.fasterxml.jackson.databind.ObjectMapper 无法解析

带有 Jersey 2.2 和 Jackson 2.1 的自定义 ObjectMapper

Spring boot与Jackson ObjectMapper

ObjectMapper类

Jackson ObjectMapper给出了递归数据类型的错误