簡體   English   中英

傑克遜:地圖反序列化

[英]Jackson: Map Deserialization

我想反序列化以下json-string到此地圖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的構造函數中執行此操作。

我是從這個非常有用的帖子中的示例6中得到的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM