gpt4 book ai didi

java - Jackson typeId 不包含在生成的 json 中

转载 作者:行者123 更新时间:2023-11-30 03:36:39 25 4
gpt4 key购买 nike

有以下类(class):

public class BaseEntity<E> {
public TrackedChange<E> trackChange;
}


@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({ @JsonSubTypes.Type(value=B.class, name="b_type") })
public abstract class A extends BaseEntity<A> implements Cloneable{
public String aFoo;

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

@JsonTypeName("b_type")
public class B extends A {
public String bFoo;
}

public class TrackedChange<E> {
public E tracked;
}

public class Runner {

public static void main(String[] args) throws JsonProcessingException, CloneNotSupportedException {

B bInstance = new B();
bInstance.bFoo = "bFoo";
bInstance.aFoo = "aFoo";
B clone = (B) bInstance.clone();
bInstance.trackChange = new TrackedChange<A>();
bInstance.trackChange.tracked = clone;
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(bInstance));
}
}

生成的 JSON 为:

{
"type":"b_type",
"trackChange":{
"tracked":{
"trackChange":null,
"aFoo":"aFoo",
"bFoo":"bFoo"
}
},
"aFoo":"aFoo",
"bFoo":"bFoo"
}

类型("type":"b_type")信息不包含在trackChange.tracked对象中。如何解决这个问题?

编辑:最后我使用了 2.3.0 版本后引入的 JsonTypeInfo.As.EXISTING_PROPERTY 。它利用现有属性来确定实际类型。

最佳答案

TrackedChange.tracked 上的类型删除是您的问题。在运行时,您的类型由于类型删除而丢失,并且 Jackson 序列化程序无法确定类型,因此无法将其识别为 B 并且找不到 @JsonTypeInfo 为了它;因此,在运行时 Jackson 将 TrackedChange.tracked 读取为 Object 类型。

有多种方法可以减轻 Jackson 中的类型删除,但它们通常源于集合上的泛型。

我认为只有一种方法可以基本实现您的目标,您可以像这样配置 ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
TypeResolverBuilder<?> typer = new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE);
typer = typer.init(JsonTypeInfo.Id.CLASS, null);
typer = typer.inclusion(JsonTypeInfo.As.PROPERTY);
typer = typer.typeProperty("type");
mapper.setDefaultTyping(typer);

这将在序列化期间为对象和非具体类型注册类型映射器配置(这涵盖了 TrackedChange.tracked 情况)。不幸的是,我没有看到任何方法可以预先注册此配置将使用匹配的 b_type 名称,如您的示例中所示。我最好的建议是更改您的类配置以使用以下配置,它与上面配置的行为相匹配:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "type")

给你这样的输出:

{
"type" : "so.json.typeinfo.B",
"trackChange" : {
"tracked" : {
"type" : "so.json.typeinfo.B",
"trackChange" : null,
"aFoo" : "aFoo",
"bFoo" : "bFoo"
}
},
"aFoo" : "aFoo",
"bFoo" : "bFoo"
}

关于java - Jackson typeId 不包含在生成的 json 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27746536/

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