java - JSON嵌套类数据绑定(bind)

标签 java json jackson

{ "type":"cat", "animal":{"name":"cat"} }

Animal 是一个抽象类。 Cat 和 Dog 是子类

现在我正在尝试将 json 转换为 java 对象,并希望使用“type”来获取子类。

但是type字段不在animal列中。

提前致谢:)

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property= "type")
@JsonSubTypes({ @Type(value = Cat.class, name = "cat"),
    @Type(value = Dog.class, name = "dog") })
abstract class Animal {
    public String name;
}



class Cat extends Animal {
public String name;
}

class Dog extends Animal {
public String name;
}

问题是类型不是动物{}。

如果类型是动物{},代码将起作用。但它不是):

最佳答案

这是可能的,但 JSON 中的类型应该类似于 "type":"com.test.Cat"(完全限定名称)
抽象类

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="type")
public abstract class AAnimal 
{
}  

子类

public class Cat extends AAnimal
{
   public String name;
} 
public class Dog extends AAnimal
{
   public String name;
}  

现在,对于 json

"{ \"type\":\"com.test.Dog\", \"name\":\"gav-gav\" }"  

它将是Dog实例
对于

"{ \"type\":\"com.test.Cat\", \"name\":\"mew-mew\" }" 

它将是 Cat 实例
编辑
在这种情况下使用 JsonTypeInfo.As.EXTERNAL_PROPERTY。例子

public class Container 
{
   private String type;

   private AAnimal animal;

   public String getType()
   {
      return type;
   }

   public void setType(String type)
   {
      this.type = type;
   }

   public AAnimal getAnimal()
   {
      return animal;
   }

   @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.EXTERNAL_PROPERTY, property="type")
   public void setAnimal(AAnimal animal)
   {
      this.animal = animal;
   }
}  

动物类

public abstract class AAnimal 
{
   public String name;
}
public class Cat extends AAnimal
{
}
public class Dog extends AAnimal
{
}  

对于

"{\"type\":\"com.test.Cat\", \"animal\" : {\"name\":\"cat\" }}"

效果不错。
附言。 您也可以使用 use=JsonTypeInfo.Id.MINIMAL_CLASS,在这种情况下您只能使用完全限定名称的一部分
EDIT2

   @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.EXTERNAL_PROPERTY, property="type")
   @JsonSubTypes({ @Type(value = Cat.class, name = "cat"), @Type(value = Dog.class, name = "dog") })
   public void setAnimal(AAnimal animal)
   {
      this.animal = animal;
   }  

适用于

"{\"type\":\"cat\", \"animal\" : {\"name\":\"cat\" }}"

关于java - JSON嵌套类数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14038084/

相关文章:

java - Java中的堆栈问题

java - parseInt 时 SQLite 错误

java - 如何通过 FileHandler 为 Logger 文件创建目录

java - 第三方类的 Jackson JSON 自定义类实例化器

java - 获取 Java SSLSocket 的可信 X509Certificate

php - 使用 javascript 和 json 字符串在网页中进行 http 调用

javascript - 使用 Promise.all() Javascript 解析多个 JSON

android - 如何从 JSONARRAY 中的 JSONOBJECT 获取值?

mysql - JSON 打印时带有反斜杠

java - 序列化 Hibernate 对象时抛出奇怪的 Jackson 异常