Java 使用Jackson';反序列化时如何保留type属性;s@JsonTypeInfo?

Java 使用Jackson';反序列化时如何保留type属性;s@JsonTypeInfo?,java,json,polymorphism,jackson,deserialization,Java,Json,Polymorphism,Jackson,Deserialization,我有这样的设置: @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "dishName", defaultImpl = Food.class) @JsonSubTypes(value = { @Type(name = "fries", value = Fries.class), @Type(name = "burger", value = Burger.

我有这样的设置:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "dishName", defaultImpl = Food.class)
@JsonSubTypes(value = {
    @Type(name = "fries", value = Fries.class),
    @Type(name = "burger", value = Burger.class)
})
public class Food {
  private String dishName;

  @Override
  public String toString() {
    return dishName + ", type: " + this.getClass().getName();
  }
}

public class Fries extends Food { /*...*/ }

public class Burger extends Food { /*...*/ }

public class TryItOut {

  private static String foodString = "[ { \"dishName\":\"burger\" }, { \"dishName\":\"fries\" }, { \"dishName\":\"cabbage\" } ]";

  public static void main(String[] args) {
    ObjectMapper m = new ObjectMapper();
    try {
        Food[] food = m.readValue(foodString, Food[].class);
        for (Food dish : food) {
            System.out.println(dish);
        }
    } catch (IOException e) {
        System.out.println("something went wrong");
        e.printStackTrace();
    }
  }
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "dishName", defaultImpl = Food.class, visible = true)
@JsonSubTypes(value = {
    @Type(name = "fries", value = Fries.class),
    @Type(name = "burger", value = Burger.class)
})
public class Food {

  @JsonProperty
  private String dishName;

  @Override
  public String toString() {
    return dishName + ", type: " + this.getClass().getName();
  }
}

public class Fries extends Food { /*...*/ }

public class Burger extends Food { /*...*/ }

public class TryItOut {

  private static String foodString = "[ { \"dishName\":\"burger\" }, { \"dishName\":\"fries\" }, { \"dishName\":\"cabbage\" } ]";

  public static void main(String[] args) {
    ObjectMapper m = new ObjectMapper();
    try {
        Food[] food = m.readValue(foodString, Food[].class);
        for (Food dish : food) {
            System.out.println(dish);
        }
    } catch (IOException e) {
        System.out.println("something went wrong");
        e.printStackTrace();
    }
  }
}
我想用它来反序列化json,而json的内容我无法影响(因此没有添加“适当”类型信息的选项)。我的问题是,显然
dishName
json属性用于确定子类型,但它没有反序列化到java字段中。有没有办法实现这一点?换句话说:主要方法是打印

null, type: Burger
null, type: Fries
null, type: Food
在控制台上,但我想打印出来

burger, type: Burger
fries, type: Fries
cabbage, type: Food
这尤其令人讨厌,因为我以后无法发现最后一个物体是卷心菜。这就抵消了默认实现的好处

编辑:

@邪恶的拉特的回答起了作用。为了完整性起见:
Food
类中的
dishName
字段需要
@JsonProperty
注释才能工作。因此,工作示例如下所示:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "dishName", defaultImpl = Food.class)
@JsonSubTypes(value = {
    @Type(name = "fries", value = Fries.class),
    @Type(name = "burger", value = Burger.class)
})
public class Food {
  private String dishName;

  @Override
  public String toString() {
    return dishName + ", type: " + this.getClass().getName();
  }
}

public class Fries extends Food { /*...*/ }

public class Burger extends Food { /*...*/ }

public class TryItOut {

  private static String foodString = "[ { \"dishName\":\"burger\" }, { \"dishName\":\"fries\" }, { \"dishName\":\"cabbage\" } ]";

  public static void main(String[] args) {
    ObjectMapper m = new ObjectMapper();
    try {
        Food[] food = m.readValue(foodString, Food[].class);
        for (Food dish : food) {
            System.out.println(dish);
        }
    } catch (IOException e) {
        System.out.println("something went wrong");
        e.printStackTrace();
    }
  }
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "dishName", defaultImpl = Food.class, visible = true)
@JsonSubTypes(value = {
    @Type(name = "fries", value = Fries.class),
    @Type(name = "burger", value = Burger.class)
})
public class Food {

  @JsonProperty
  private String dishName;

  @Override
  public String toString() {
    return dishName + ", type: " + this.getClass().getName();
  }
}

public class Fries extends Food { /*...*/ }

public class Burger extends Food { /*...*/ }

public class TryItOut {

  private static String foodString = "[ { \"dishName\":\"burger\" }, { \"dishName\":\"fries\" }, { \"dishName\":\"cabbage\" } ]";

  public static void main(String[] args) {
    ObjectMapper m = new ObjectMapper();
    try {
        Food[] food = m.readValue(foodString, Food[].class);
        for (Food dish : food) {
            System.out.println(dish);
        }
    } catch (IOException e) {
        System.out.println("something went wrong");
        e.printStackTrace();
    }
  }
}

要维护用于反序列化的属性的值,只需在@JsonSubTypes注释中将visible属性设置为true:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.PROPERTY,PROPERTY=“dishName”,defaultImpl=Food.class,visible=true)