无法找到非混凝土集合类型反序列化(Can not find deserialize for non-

2019-07-19 19:43发布

我使用的是杰克逊库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方法,它应该只是设置我表示的字段。

这是怎么回事吗?

Answer 1:

您需要使用的番石榴模块在ObjectMapper。 这里是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注解。

更多信息这里 。



Answer 2:

我已经通过将固定这个ForeignCollectionList

private ForeignCollection<MyObject> myObjects;

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


Answer 3:

您可能需要定义自定义解串器ForeignCollection ; 或者,如果有知道的实现类,使用注释:

@JsonDeserialize(as=ForeignCollectionImpl.class)

以指示使用抽象类型的具体子类。



文章来源: Can not find deserialize for non-concrete Collection type