Jackson Parser 无法读取字符串中的反斜杠引号

Jackson Parser can't read backslash quotation marks in String

我从服务器得到了这样的JSON:

{
  "id":"1",
  "value":13,
  "text":"{\"Pid\":\"2\",\"value\":42}"
}

我正在使用 jackson 库将此 JSON 字符串反序列化为 java 对象,代码如下:(示例如下)

ObjectMapper mapper = new ObjectMapper();
MapObj obj = mapper.readValue(JSONfromServerInString, MapObj.class);

地图对象看起来像这样:

public class MapObj {
        @JsonProperty("id")
        private Integer id;
        @JsonProperty("value")
        private Integer value;
        @JsonProperty("text")
        private String text;

        public Integer getId() {return id;}
        public void setId(Integer id) {this.id = id;}
        public Integer getValue() {return value;}
        public void setValue(Integer value) {this.value = value;}
        public String getText() {return text;}
        public void setText(String text) {this.text = text;}
    }

但是当我尝试用引号前的反斜杠反序列化这个字符串时。杰克逊解串器似乎在找到字符串的第一个结尾时就结束了。他忽略了那个反斜杠。所以这个例子会输出这个:

org.codehaus.jackson.JsonParseException: Unexpected character ('P' (code 80)): was expecting comma to separate OBJECT entries at [Source: java.io.StringReader@2f7c7260; line: 1, column: 33]

(('P'(代码80))代表原JSON字符串中的P字符\"Pid\")

看起来服务器正在将 "text" 映射转换为字符串,然后再在响应中返回它。是否可以在服务器端进行更改以将地图作为一个整体发送,以便正确完成地图的序列化?

据我所知,Jackson 默认情况下无法将字符串反序列化为 Map。

你确定它不起作用吗?这个测试工作正常:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        ObjectMapper objectMapper = new ObjectMapper();

        String json = "{\n" +
                "  \"id\":\"1\",\n" +
                "  \"value\":13,\n" +
                "  \"text\":\"{\\"Pid\\":\\"2\\",\\"value\\":42}\"\n" +
                "}";

        MapObj mapObj = objectMapper.readValue(json, MapObj.class);
        System.out.println("text = " + mapObj.getText());
    }

    private static class MapObj {
        @JsonProperty("id")
        private Integer id;
        @JsonProperty("value")
        private Integer value;
        @JsonProperty("text")
        private String text;

        public Integer getId() {return id;}
        public void setId(Integer id) {this.id = id;}
        public Integer getValue() {return value;}
        public void setValue(Integer value) {this.value = value;}
        public String getText() {return text;}
        public void setText(String text) {this.text = text;}
    }
}

它打印:

text = {"Pid":"2","value":42}

使用 Jackson 2.6.4

所以我找到了解决方案。

JSONfromServerInString.replace("\", "\\\");

它现在似乎正在工作。我发现您需要插入三次反斜杠才能使其正常工作。

所以工作字符串应该是这样的:

{
    "id" : "1",
    "value":13,
    "text":"{\\"Pid\\":\\"2\\",\\"value\\":42}"
}

我在这里找到了解决方案:

How do you replace double quotes with a blank space in Java?