java - Jackson - 多版本字段;回退到默认解串器

标签 java json jackson deserialization

我有以下类(构造函数、getters……为了简洁起见,省略了):

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"
        }
    ]
}

在这种情况下,没有给出类型。我不希望用户费心将其项目列表包装在项目对象中。

我开始创建自己的解串器:

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)的默认序列化器在我的解串器中?我相信简单地回退到默认反序列化器即可完成实现。

最佳答案

实际上很简单:

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);
    }
}

关于java - Jackson - 多版本字段;回退到默认解串器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32178032/

相关文章:

java - 在 Java 中设置具有多个索引的变量的 OR 工具

java - 简单的 JXLS/Apache POI 示例失败

java - 如何从表中获取jdbc空对象

java - 未能将 VALUE_STRING 解码为 base64

java - 如何访问 JsonPropertyOrder

java protected 为什么这是通过非继承工作的?

javascript - 在 JavaScript 中处理 PHP 数组变量并能够使用索引获取这些值的最有效和正确的方法是什么

java - 如何使 java 类在运行时根据需要表现得像普通对象和对象列表?

java - 如何根据父类中可用的信息进行反序列化

java - 如何将 JSON 对象解码为 Java 类?