簡體   English   中英

傑克遜-多版本字段; 回退到默認解串器

[英]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 ,用戶給出的是長版本(帶有類型)。

如何在反序列化器中訪問Listif為,則為第一個)或MetaListif 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.

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