杰克逊 - 不能序列化泛型

时间:2017-01-06 12:45:59

标签: java json serialization jackson

这是我的班级层次结构:

香蕉课:

position

水果类:

ListView

汽车类:

@JsonTypeName("banana")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@type")
public class Banana<T, M> extends Fruit<T, M> {

摘要车辆类:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
    @JsonSubTypes({ @JsonSubTypes.Type(value = Banana.class, name = "banana")})
    public class Fruit<T, M> {
      private boolean ok;
      private T main;

所以我创建了新对象:

@JsonTypeName("car")
public class Car extends Vehicle {

Banana对象有&#34; @ type&#34;属性。

Car对象有&#34; type&#34;属性,如果我将汽车序列化为JSON,则打印出来:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({ @JsonSubTypes.Type(value = Car.class), @JsonSubTypes.Type(value = AnyOtherClass.class) })
public abstract class Vehicle<K> {
  private Date date;
  private Id<?> id;

但是,如果我将香蕉序列化为JSON,则会打印(仅#34;键入&#34;:&#34; car&#34;缺失,其他对象属性可用):

Banana<Car, String> ba = new Banana<Car, String>();
Car car = new Car("test");
ba.setMain(car);

如果我执行banana.getMain(),则打印出

{"type":"car"}

怎么可能?

我尝试了一个没有任何注释的简单对象(不是Car),并且在打印时工作正常

{}

有人提出任何想法吗?

2 个答案:

答案 0 :(得分:2)

所以答案是将JacksonMapper的根类型指定为

jacksonMapper.writerWithType(new TypeReference<Banana<Car, String>>() {})

答案 1 :(得分:1)

您需要在此处提供更完整的使用示例。我怀疑这是由于类型参数化(即,尝试序列化泛型类型的实例)和Java类型擦除,但是如果没有看到您正在使用的代码,就不可能肯定地说。