gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:25:55 26 4
gpt4 key购买 nike

我有以下类(构造函数、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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com