找不到非具体Collection类型的反序列化

时间:2013-02-13 12:13:18

标签: android json jackson ormlite

我正在使用jackson库将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]]

get类中有两个 MyObject方法返回ForeignCollection时会发生这种情况。删除其中一个get方法不会产生任何异常。

我真的很惊讶映射器查看get方法,它应该只设置我指示的字段。

这里发生了什么?

3 个答案:

答案 0 :(得分: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注释。

更多信息here

答案 1 :(得分:2)

我通过将ForeignCollection转换为List

来解决此问题
private ForeignCollection<MyObject> myObjects;

public List<MyObject> getMyObjects(){
    return new ArrayList<MyObject>(myObjects);
}

答案 2 :(得分:1)

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

@JsonDeserialize(as=ForeignCollectionImpl.class)

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