gpt4 book ai didi

java - 未为集合中的对象编写 JsonTypeInfo

转载 作者:行者123 更新时间:2023-12-02 10:07:43 25 4
gpt4 key购买 nike

我正在尝试使用 Jackson 2.9.8 序列化/反序列化多态类型,除非我将此类类型的对象放入集合中,否则它可以正常工作,因为由于某种原因,当时没有写入类型信息。让我们考虑以下示例:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "animalKind")
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog")
})
public interface Animal {
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class Dog implements Animal {
private Boolean goodBoy;
public Boolean isGoodBoy() { return goodBoy; }
public void setGoodBoy(Boolean goodBoy) { this.goodBoy = goodBoy; }
}

现在让我们序列化 Dog 的实例:

ObjectMapper objectMapper = new ObjectMapper();

Dog mike = new Dog();
mike.setGoodBoy(true);

// This works just fine
String mikeJson = objectMapper.writeValueAsString(mike);
System.out.println(mikeJson);

// This doesn't work
String listJson = objectMapper.writeValueAsString(Collections.singleton(mike));
System.out.println(listJson);

// This doesn't either
String mapJson = objectMapper.writeValueAsString(Collections.singletonMap("Mike", mike));
System.out.println(mapJson);

输出如下:

{"animalKind":"Dog","goodBoy":true}
[{"goodBoy":true}]
{"Mike":{"goodBoy":true}}

因此,animalKind 是在第一种情况下编写的,但在第二种和第三种情况下则不是。我在这里缺少一些序列化设置还是一个错误?

谢谢!

最佳答案

您需要指示Jackson您需要通过读取抽象类型注释给定集合。请参阅示例:

CollectionType animalsListType = mapper.getTypeFactory()
.constructCollectionType(Set.class, Animal.class);
System.out.println(mapper.writer().withType(animalsListType).writeValueAsString(Collections.singleton(mike)));

Map<String, Dog> mikeMap = Collections.singletonMap("Mike", mike);
MapType mapType = mapper.getTypeFactory().constructMapType(Map.class, String.class, Animal.class);
System.out.println(mapper.writer().withType(mapType).writeValueAsString(mikeMap));

上面的代码打印:

[{"animalKind":"Dog","goodBoy":true}]
{"Mike":{"animalKind":"Dog","goodBoy":true}}

关于java - 未为集合中的对象编写 JsonTypeInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55220444/

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