Jackson Parser无法读取字符串

时间:2016-01-18 15:56:58

标签: java json jackson jsonobject

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

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

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

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

Map Object看起来像这样:

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;}
    }

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

  

org.codehaus.jackson.JsonParseException:意外字符('P'(代码80)):期待逗号分隔OBJECT条目    在[来源:java.io.StringReader@2f7c7260; line:1,column:33]

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

所以我找到了解决方案。

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

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

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

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

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

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