JSON嵌套类数据绑定

Fel*_*lix 4 java json jackson

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

动物是一种abstract class.猫与狗是subclass.

现在我正在尝试convert json to java object并希望使用"type"来获取子类.

但是类型字段不在列中.

提前致谢 :)

@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;
}
Run Code Online (Sandbox Code Playgroud)

问题是类型是动物{}.

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

Ily*_*lya 8

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

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

子类

public class Cat extends AAnimal
{
   public String name;
} 
public class Dog extends AAnimal
{
   public String name;
}  
Run Code Online (Sandbox Code Playgroud)

现在,为json

"{ \"type\":\"com.test.Dog\", \"name\":\"gav-gav\" }"  
Run Code Online (Sandbox Code Playgroud)

它将是Dog实例

"{ \"type\":\"com.test.Cat\", \"name\":\"mew-mew\" }" 
Run Code Online (Sandbox Code Playgroud)

它将是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;
   }
}  
Run Code Online (Sandbox Code Playgroud)

动物类

public abstract class AAnimal 
{
   public String name;
}
public class Cat extends AAnimal
{
}
public class Dog extends AAnimal
{
}  
Run Code Online (Sandbox Code Playgroud)

对于

"{\"type\":\"com.test.Cat\", \"animal\" : {\"name\":\"cat\" }}"
Run Code Online (Sandbox Code Playgroud)

它运作良好.
PS. 您也可以使用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;
   }  
Run Code Online (Sandbox Code Playgroud)

效果很好

"{\"type\":\"cat\", \"animal\" : {\"name\":\"cat\" }}"
Run Code Online (Sandbox Code Playgroud)