[英]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.