gpt4 book ai didi

java - Jackson @JsonTypeInfo property 属性采用字符串值

转载 作者:行者123 更新时间:2023-11-30 06:37:12 29 4
gpt4 key购买 nike

假设我有一些像这样的 JSON

[
{
'type' : {
'value': 'B'
}
},
{
'type' : {
'value': 'C'
}
}
]

是否可以使用 Jackson 使用 types 值属性来告诉 Jackson 该对象是什么多态类型?例如,我尝试过类似的方法,但没有任何运气

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.Property, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(name = "B", value = B.class),
@JsonSubTypes.Type(name = "C", value = C.class)
}
)
abstract class A {
private Type type;
}

@JsonTypeName(value = "B")
class B extends A {
}

@JsonTypeName(value = "C")
class C extends A {
}

class Type {
private String value;
}

最佳答案

Jackson 似乎不支持使用嵌套在 JSON 中另一个对象中的 String 来辨别类型。您始终可以使用自定义反序列化器来完成此类操作。它看起来像这样:

class ADeserializer extends JsonDeserializer<A> {
@Override public A deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
ObjectMapper mapper = (ObjectMapper) p.getCodec();
ObjectNode node = mapper.readTree(p);
String value = node.get("type").get("value").asText();
switch (value) {
case "B": return mapper.treeToValue(node, B.class);
case "C": return mapper.treeToValue(node, C.class);
default: return null;
}
}
}

并使用它注释抽象类来指定反序列化器:

@JsonDeserialize(using = ADeserializer.class)
abstract class A {

以及带有空@JsonDeserialize的派生类,以避免再次调用相同的自定义反序列化器(StackOverflowError)。

@JsonDeserialize
class B extends A {

上述内容不需要 @JsonTypeName@JsonTypeInfo@JsonSubTypes

我查看了其他一些选项,例如自定义 JsonTypeIdResolverthis answer延伸AsPropertyTypeDeserializer但无法让其中任何一个在您的情况下工作。

关于java - Jackson @JsonTypeInfo property 属性采用字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45009309/

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