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