1

我正在使用杰克逊库将 JSON 映射到对象中。我已经简化了很多问题,这就是发生的事情:

public class MyObject{

    public ForeignCollection<MySecondObject> getA(){
        return null;
    }

    public ForeignCollection<MyThirdObject> getB(){
        return null;
    }
}

我正在解析一个空的 JSON 字符串:

ObjectMapper mapper = new ObjectMapper();
mapper.readValue("{}", MyObject.class);

readValue,我得到这个异常:

com.fasterxml.jackson.databind.JsonMappingException: Can not find a deserializer for non-concrete Collection type [collection type; class com.j256.ormlite.dao.ForeignCollection, contains [simple type, class com.test.MyThirdObject]]

当我在类中有两个 返回 a 的get方法时会发生这种情况。删除其中一种方法不会导致异常。MyObjectForeignCollectionget

实际上,我对映射器查看get方法的事实感到惊讶,它应该只设置我指示的字段。

这里发生了什么?

4

3 回答 3

3

您需要在 ObjectMapper 中使用 Guava 模块。这是 Maven 依赖项:

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-guava</artifactId>
  <version>{whatever is the latest}</version>
</dependency>

在您的代码中:

ObjectMapper mapper = new ObjectMapper();
// register module with object mapper
mapper.registerModule(new GuavaModule());

您可以省略@JsonDeserialize@JsonSerialize注释。

更多信息在这里

于 2018-03-20T19:51:33.897 回答
2

我已通过将其转换ForeignCollection为 a 来解决此问题List

private ForeignCollection<MyObject> myObjects;

public List<MyObject> getMyObjects(){
    return new ArrayList<MyObject>(myObjects);
}
于 2013-02-17T12:08:31.103 回答
1

您可能需要为ForeignCollection;定义自定义反序列化器。或者,如果有已知的实现类,使用注解:

@JsonDeserialize(as=ForeignCollectionImpl.class)

指示要用于该抽象类型的具体子类。

于 2013-02-14T05:54:48.853 回答