【问题标题】:Cannot instantiate value of type java.util.LinkedHashMap from String value ('{'); no single-String constructor/factory method无法从字符串值 ('{') 实例化 java.util.LinkedHashMap 类型的值;没有单字符串构造函数/工厂方法
【发布时间】:2015-09-07 06:08:56
【问题描述】:

我有以下两个课程:

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

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

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

我得到以下异常:

com.fasterxml.jackson.databind.JsonMappingException: 不能 从 String 值实例化 java.util.LinkedHashMap 类型的值 ('{'); [来源:没有单字符串构造函数/工厂方法: {"更改":[{"epoch":1441556306522,"payload":"{"to":1}"},{"epoch":1441555481524,"payload":"{"to":-1}"} ],"更多":false}; 行:1,列:35](通过参考链: demo.ChangesJSON["changes"]->java.util.ArrayList[0]->demo.ChangeJSON["payload"])

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

【问题讨论】:

  • 您的 JSON 无效。如果您删除转义的反斜杠,它将包含 "payload": "{"to":1}"} 而不是 "payload": {"to":1}}

标签: java json jackson fasterxml


【解决方案1】:

payload 对象周围有引号。尝试更改这部分:

\"payload\":\"{\"to\":1}\"

进入这个:

\"payload\":{\"to\":1}

【讨论】:

    【解决方案2】:

    我认为是 JSON 本身有问题。它转义为:

    {"changes":[{"epoch":1441556306522,"payload":"{"to":1}"},{"epoch":1441555481524,"payload":"{"to":-1}"}],"more":false}
    

    应该是这样的:

    {"changes":[{"epoch":1441556306522,"payload":{"to":1}},{"epoch":1441555481524,"payload":{"to":-1}}],"more":false}
    

    所以:

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

    【讨论】:

      猜你喜欢
      • 2014-07-20
      • 1970-01-01
      • 2012-06-06
      • 2019-01-21
      • 1970-01-01
      • 2019-06-14
      • 2017-03-03
      • 1970-01-01
      • 2018-02-02
      相关资源
      最近更新 更多