[英]jackson - multi version field; fallback to default deserializer
我有以下課程(構造函數,獲取方法,為簡潔起見...):
public static class MetaList {
@JsonProperty("type")
private String type;
@JsonProperty("items")
private List<Item> items;
}
public static class Item {
@JsonProperty("name")
private String name;
}
public static class Data {
@JsonProperty("items")
@JsonDeserialize(using = Deserializer.class)
private MetaList items;
}
我將List
包裝到MetaList
,以便能夠用類型注釋列表。 Data
類的JSON示例如下:
{
"items": {
"type": "DELTA",
"items": [
{
"name": "item 1"
},
{
"name": "item 2"
}
]
}
}
我希望能夠還解析以下輸入:
{
"items": [
{
"name": "item 1"
},
{
"name": "item 2"
}
]
}
在這種情況下,不會給出任何類型。 我不希望用戶費心將其項目列表包裝在items對象中。
我首先創建自己的解串器:
public static class Deserializer extends JsonDeserializer<MetaList> {
@Override
public MetaList deserialize(final JsonParser parser, final DeserializationContext context) throws IOException {
final JsonToken token = parser.getCurrentToken();
if (JsonToken.START_ARRAY.equals(token)) {
return new MetaList(null, ... QUESTION ...);
} else if (JsonToken.START_OBJECT.equals(token)) {
return ... QUESTION ...
}
throw context.mappingException(MetaList.class);
}
}
在第一個if
,用戶給出的是簡短版本(無類型)。 在第二個if
,用戶給出的是長版本(帶有類型)。
如何在反序列化器中訪問List
( if
為,則為第一個)或MetaList
( if
MetaList
第二)的默認序列化器? 我相信對默認解串器的簡單回退就可以完成實現。
實際上很簡單:
public static class Deserializer extends JsonDeserializer<MetaList> {
@Override
public MetaList deserialize(final JsonParser parser, final DeserializationContext context) throws IOException {
final JsonToken token= parser.getCurrentToken();
if (JsonToken.START_ARRAY.equals(token)) {
return new MetaList(null, (List) context.findRootValueDeserializer(context.constructType(List.class)).deserialize(parser, context));
} else if (JsonToken.START_OBJECT.equals(token)) {
return (MetaList) context.findRootValueDeserializer(context.constructType(MetaList.class)).deserialize(parser, context);
}
throw context.mappingException(MetaList.class);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.