gpt4 book ai didi

java - Jackson: map 反序列化

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:09 25 4
gpt4 key购买 nike

我想将以下 json 字符串反序列化到此 map Map<String, IAnimal> 。我的问题是 json 字符串中动物的值不包含任何类型信息,仅依赖于键。

{
"dog": {
"age": 5
},
"cat": {
"age": 2
}
}

interface IAnimal {

}

class Dog implements IAnimal {
int age;
// getter & setter
}

class Cat implements IAnimal {
int age;
// getter & setter
}

最佳答案

您必须为此编写一个自定义反序列化器:

public class AnimalDeserializer extends StdDeserializer<IAnimal> {

private Map<String, Class<? extends IAnimal>> registry = new HashMap<String, Class<? extends Animal>>();

public AnimalDeserializer() {
super(IAnimal.class);
}

public void registerAnimal(String uniqueAttribute, Class<? extends IAnimal> animalClass) {
registry.put(uniqueAttribute, animalClass);
}

@Override
public IAnimal deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
ObjectMapper mapper = (ObjectMapper) parser.getCodec();
ObjectNode root = (ObjectNode) mapper.readTree(parser);

Class<? extends IAnimal> animalClass = null;
Iterator<Entry<String, JsonNode>> iterator = root.getFields();
boolean found = false;
while (!found &&iterator.hasNext()) {
Entry<String, JsonNode> element = elementsIterator.next();
String name = element.getKey();

if(registry.containsKey(name)) {
animalClass = registry.get(name);
found = true;
}
}

if(animalClass == null) {
return null;
} else {
return mapper.readValue(root, animalClass);
}
}
}

当您实例化反序列化器时,您必须注册映射到适当类的属性名称:

AnimalDeserializer deserializer = new AnimalDeserializer();  
deserializer.registerAnimal("dog", Dog.class);
deserializer.registerAnimal("cat", Cat.class);

如果您事先知道属性是什么,您也可以在 AnimalDeserializer 的构造函数中执行此操作。

我从this示例6中得到了这个非常有用的帖子。

关于java - Jackson: map 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24916213/

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