Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 生成的json中不包括Jackson typeId_Java_Json_Serialization_Polymorphism_Jackson - Fatal编程技术网

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,它开始按预期工作!