我正在使用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
方法,它应该只设置我指示的字段。
这里发生了什么?
答案 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)
指示用于该抽象类型的具体子类。