Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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嵌套类数据绑定_Java_Json_Jackson - Fatal编程技术网

Java JSON嵌套类数据绑定

Java JSON嵌套类数据绑定,java,json,jackson,Java,Json,Jackson,{“类型”:“猫”、“动物”:{“名称”:“猫”}} 动物是一个抽象类。猫和狗是子类 现在我正在尝试将json转换为java对象,并希望使用“type”来获取子类 但是类型字段不在列中 提前感谢:) 问题是,这一类型是动物{}以外的 如果类型在animal{}中,代码将起作用。但是它不是:这是可能的,但是JSON中的类型应该类似于“type”:“com.test.Cat”(完全限定名) 抽象类 @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=Js

{“类型”:“猫”、“动物”:{“名称”:“猫”}}

动物是一个
抽象类
。猫和狗是
子类

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

但是类型字段不在列中

提前感谢:)

问题是,这一类型是动物{}以外的


如果类型在animal{}中,代码将起作用。但是它不是:

这是可能的,但是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;
}  
public abstract class AAnimal 
{
   public String name;
}
public class Cat extends AAnimal
{
}
public class Dog extends AAnimal
{
}  
现在,对于json

"{ \"type\":\"com.test.Dog\", \"name\":\"gav-gav\" }"  
它将是
Dog
实例
以及

"{ \"type\":\"com.test.Cat\", \"name\":\"mew-mew\" }" 
它将是
Cat
instance
编辑
在这种情况下,请使用
JsonTypeInfo.As.EXTERNAL\u属性
。范例

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\" }}"
它工作得很好。
PS. 您还可以使用
use=JsonTypeInfo.Id.MINIMAL\u 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\" }}"

但是类型字段不在动物{}中。如果类型必须是1或2,我如何更改JsonTypeInfo?类型值由其他人给定,我无法将其更改为com.package.Cat):@llyahi@llya我再次遇到问题。当我反序列化时,我得到了两个类型列:{“type”:1,“type”:“1”,}@Felix我还不知道答案。我可能会在3小时内回答。请为其创建新问题,因为获取两个类型字段(我的反序列化失败):