java - Jackson: map 反序列化

标签 java json jackson

我想将以下 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/

相关文章:

java - 将自定义参数传递给 Dozer 映射

php - SWIFT 和 PHP 与 JSON 交换

java - Jackson反序列化泛型类,自定义可选

java - java将罗马数字转换为数字逻辑错误

java double free or corruption

java - 无法将流输出到浏览器

javascript - 在不破坏现有保存的情况下更改保存的应用程序数据格式的策略 (JavaScript+IndexedDB)

python - JSON 错误 : "end is out of bounds"?

java - 使用 Jackson 进行 JSON 反序列化

java - 序列化嵌套对象json jackson