gpt4 book ai didi

java - jackson 反序列化多态类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:08 30 4
gpt4 key购买 nike

我有以下示例类:

class Zoo {
public Collection<? extends Animal> animals;
}

序列化时,我尝试通过以下方式序列化尽可能多的类型信息:

  mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

我得到以下 JSON:

[
"com.bp.samples.json.generics.Zoo",
{
"animals": [
"java.util.ArrayList",
[
[
"com.bp.samples.json.generics.Bird",
{
"name": "bird-1",
"wingSpan": "6 feets",
"preferredFood": "food-1"
}
],
[
"com.bp.samples.json.generics.Cat",
{
"name": "cat-1",
"favoriteToy": "toy-1"
}
],
[
"com.bp.samples.json.generics.Dog",
{
"name": "dog-1",
"breed": "bread-1",
"leashColor": "black"
}
]
]
]
}
]

当谈到反序列化时,试图做到:

mapper.readValue(new File("./DataFiles/Zoo-2.json"), Zoo.class);

导致以下异常:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: 
Can not deserialize instance of com.bp.samples.json.generics.Zoo out of START_ARRAY toke

并努力做到:

mapper.readValue(new File("./DataFiles/Zoo-2.json"), 
new TypeReference<Collection<? extends Animal>>() {});

结果:

Can not construct instance of com.bp.samples.json.generics.Animal, 
problem: abstract types either need to be mapped to concrete types, have custom
deserializer, or be instantiated with additional type information
at [Source: ./DataFiles/Zoo-2.json; line: 2, column: 5]

编写自定义反序列化器当然可以解决问题,但是没有自定义反序列化器就可以反序列化吗?

谢谢,贝扎德

最佳答案

据我所知,您的第一次尝试应该会成功。我能想到的唯一解释是您正在尝试使用不同配置的 ObjectMapper 进行反序列化:两者都必须以相同的方式启用默认类型(因为这是控制类型信息是否包含或不是)。

如果您使用相同的映射器实例(或相同配置),您可能需要提交错误报告以便诊断和修复问题。

关于java - jackson 反序列化多态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14164002/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com