Java Jackson:地图反序列化
我想将以下json字符串反序列化到此映射Java Jackson:地图反序列化,java,json,jackson,Java,Json,Jackson,我想将以下json字符串反序列化到此映射map。我的问题是json字符串中动物的值不包含任何类型信息,并且只依赖于键 { "dog": { "age": 5 }, "cat": { "age": 2 } } interface IAnimal { } class Dog implements IAnimal { int age; // getter & setter } class Cat imple
map
。我的问题是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
的构造函数中执行此操作
这是我从非常有用的帖子中获得的。这很有效。非常感谢。但我想知道为什么没有带注释的简单解决方案。@Maxii不幸没有。如果有一个基于属性的存在或不存在的注释就好了,但不幸的是没有注释。为什么这个问题被否决了?这是一个合理的问题。
AnimalDeserializer deserializer = new AnimalDeserializer();
deserializer.registerAnimal("dog", Dog.class);
deserializer.registerAnimal("cat", Cat.class);