簡體   English   中英

Jackson自定義屬性 - 多態屬性的類型映射名稱

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

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