Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 杰克逊-多版本字段;回退到默认反序列化程序_Java_Json_Jackson_Deserialization - Fatal编程技术网

Java 杰克逊-多版本字段;回退到默认反序列化程序

Java 杰克逊-多版本字段;回退到默认反序列化程序,java,json,jackson,deserialization,Java,Json,Jackson,Deserialization,我有以下类(构造函数、getter等),为简洁起见,将它们省略了: 我还希望能够分析以下输入: { "items": [ { "name": "item 1" }, { "name": "item 2" } ] } 在这种情况下,没有给出类型。我不想让用户费心将他的项目列表包装到items对象中 我从创建自己的反序列化程序开始: public static class

我有以下类(构造函数、getter等),为简洁起见,将它们省略了:

我还希望能够分析以下输入:

{
    "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);
    }
}
公共静态类反序列化程序扩展JsonDeserializer{
@凌驾
公共MetaList反序列化(最终JsonParser解析器,最终反序列化上下文)引发IOException{
最终的JsonToken令牌=parser.getCurrentToken();
if(JsonToken.START_ARRAY.equals(令牌)){
返回新的金属列表(空,…问题…);
}else if(JsonToken.START_OBJECT.equals(令牌)){
返回…问题。。。
}
抛出context.mappingException(MetaList.class);
}
}
在第一个
if
中,用户给出的是短版本(没有类型)。在第二个
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);
    }
}
公共静态类反序列化程序扩展JsonDeserializer{
@凌驾
公共MetaList反序列化(最终JsonParser解析器,最终反序列化上下文)引发IOException{
最终的JsonToken令牌=parser.getCurrentToken();
if(JsonToken.START_ARRAY.equals(令牌)){
返回新的MetaList(null,(List)context.findRootValueDeserializer(context.constructType(List.class)).deserialize(parser,context));
}else if(JsonToken.START_OBJECT.equals(令牌)){
return(MetaList)context.findRootValueDeserializer(context.constructType(MetaList.class)).deserialize(parser,context);
}
抛出context.mappingException(MetaList.class);
}
}
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);
    }
}
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);
    }
}