JSON 嵌套类数据绑定 [英] JSON nest class data binding

查看:29
本文介绍了JSON 嵌套类数据绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Animal 是一个抽象类.猫和狗是子类.

Animal is an abstract class. Cat and Dog are subclass.

现在我正在尝试将json转换为java对象并想使用type"来获取子类.

Now I am trying to convert json to java object and want to use "type" to get the subclass.

但是 type 字段不在该列中.

But the type field is out of animal the column.

提前致谢:)

@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;
}

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

the question is the type is out of animal{}.

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

if the type is in the animal{} the code will works. but it isn`t ):

推荐答案

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

It's possible, but type in JSON should looks like "type":"com.test.Cat" (fully qualified name)
Abstract class

@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

now, for json

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

它将是 Dog 实例
而对于

it will be Dog instance
and for

"{ "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

it works well.
PS. Also you can use use=JsonTypeInfo.Id.MINIMAL_CLASS, in this case you can use only part of fully qualified name
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" }}"

这篇关于JSON 嵌套类数据绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆