Java 生成的json中不包括Jackson typeId
有以下课程:Java 生成的json中不包括Jackson typeId,java,json,serialization,polymorphism,jackson,Java,Json,Serialization,Polymorphism,Jackson,有以下课程: 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_ty
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));
}
}
类型(“类型”:“b_类型”)
信息不包括在trackChange.tracked对象中。如何解决这个问题
编辑:最后我使用了
JsonTypeInfo.As.EXISTING\u属性,它是在2.3.0版之后引入的。它利用现有属性来确定实际类型。在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);
{
"type" : "so.json.typeinfo.B",
"trackChange" : {
"tracked" : {
"type" : "so.json.typeinfo.B",
"trackChange" : null,
"aFoo" : "aFoo",
"bFoo" : "bFoo"
}
},
"aFoo" : "aFoo",
"bFoo" : "bFoo"
}
给您这样的输出:
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);
{
"type" : "so.json.typeinfo.B",
"trackChange" : {
"tracked" : {
"type" : "so.json.typeinfo.B",
"trackChange" : null,
"aFoo" : "aFoo",
"bFoo" : "bFoo"
}
},
"aFoo" : "aFoo",
"bFoo" : "bFoo"
}
谢谢我将JsonTypeInfo.Id.CLASS更改为JsonTypeInfo.Id.NAME,它开始按预期工作!