无法从String值('{')实例化java.util.LinkedHashMap类型的值; 没有单字符串构造函数/工厂方法

che*_*ist 3 java json jackson fasterxml

我有以下两个班级:

@JsonIgnoreProperties(ignoreUnknown = true)
public class ChangesJSON {

    @JsonProperty("changes")
    List<ChangeJSON> changes;

    @JsonProperty("more")
    Boolean more;
}

public class ChangeJSON {

    @JsonProperty("epoch")
    Long epoch;

    @JsonProperty("payload")
    Map<String, Object> payload;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用此测试反序列化时:

String test = "{\"changes\":[{\"epoch\":1441556306522,\"payload\":\"{\"to\":1}\"},{\"epoch\":1441555481524,\"payload\":\"{\"to\":-1}\"}],\"more\":false}";

@Test
public void myTest() {
    ObjectMapper mapper = new ObjectMapper();
    ChangesJSON result = null;
    try {
        result = mapper.readValue(test, ChangesJSON.class);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    assertNotNull(result);
}
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

com.fasterxml.jackson.databind.JsonMappingException:无法从String值('{')实例化java.util.LinkedHashMap类型的值; [Source:{"changes":[{"epoch":1441556306522,"payload":"{"to":1}"},{"epoch":1441555481524,"payload"中没有单字符串构造函数/工厂方法: "{" 到 ": - 1}"}], "更多":假}; line:1,column:35](通过引用链:demo.ChangesJSON ["changes"] - > java.util.ArrayList [0] - > demo.ChangeJSON ["payload"])

似乎地图存在问题,但我认为杰克逊应该能够处理地图.当我将地图更改为Map时,我也遇到了同样的问题.但我确实需要支持各种类作为地图的值.

Pet*_*ter 6

你有payload对象周围的引号.尝试更改此部分:

\"payload\":\"{\"to\":1}\"
Run Code Online (Sandbox Code Playgroud)

进入这个:

\"payload\":{\"to\":1}
Run Code Online (Sandbox Code Playgroud)