[英]Jackson polymorphic deserialization with type property that is nested in object
[英]Jackson Custom Property-Name to Type Mapping for Polymorphic Properties
我試圖反序列化一個相當復雜的POJO JSON,我需要在其中定義一個特定的屬性名稱來進行類型解析,但是找不到這個相當簡單的功能。
假設一個類如下:
class Example {
int id;
Map<String,Object> extras;
}
和Jackson正確地將POJO序列化為JSON,其中地圖被序列化為鍵值映射,就像預期的那樣:
{...
id:5,
extras:{object1:{...}, object2:{...}}
...}
現在我想告訴傑克遜根據實際類型明確地反序列化附加對象。 所以我需要告訴Jackson以某種方式將“object1”映射到Type A,將“object2”映射到B型。
這可能嗎? 謝謝。
有一個很好的指南如何處理它: http : //www.cowtowncoder.com/blog/archives/2010/03/entry_372.html
另一個教程:
http://programmerbruce.blogspot.de/2011/05/deserialize-json-with-jackson-into.html
可以修改第二個教程中的第6個示例,並且反序列化器將具有類似於以下內容的循環:
Map<String, Class> types = ...// map of supported types
JsonToken token = jsonParser.nextToken();
if(token == JsonToken.FIELD_NAME){ // "object1" etc.
String name = jsonParser.getCurrentName();
Class type = types.get(name);
Object object = jsonParser.readValueAs(type);
}
最簡單的方法是啟用所謂的“默認類型” - 它大致相當於添加@JsonTypeInfo
注釋(它支持多態類型處理) - 這會在值中添加類型信息。 所以:
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
如果Extras映射僅包含那兩個對象(object1和object2),則可以執行以下操作
class TypeA {
// TypeA body
}
class TypeB {
// TypeB body
}
class Extras {
private TypeA object1;
private TypeB object2;
// Getters and setters
}
class Example {
int id;
Extras extras;
}
這可以使用自定義反序列化器; 例如,請參閱此鏈接 。 在一個堅果殼中,你需要告訴傑克遜應該解組一個字段的類型; 但是,如果序列化數據(JSON)動態變化,這可能會出錯。
然后,您可以輕松地注釋您的字段的setter,如下所示:
ObjectA value;
@JsonDeserialize(using=ObjectADeserializer.class)
public void setValue(ObjectA objectAValue) {
this.value = objectAValue;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.