Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson:地图反序列化_Java_Json_Jackson - Fatal编程技术网

Java Jackson:地图反序列化

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

我想将以下json字符串反序列化到此映射
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);