4

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

問題は、タイプが動物から外れていることです{}。

タイプが動物{}にある場合、コードは機能します。しかし、そうではありません):

4

1 に答える 1

8

可能ですが、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インスタンス
EDITになります。
この場合はを使用します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\" }}"

それはうまくいきます。
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;
   }  

のためにうまくいく

"{\"type\":\"cat\", \"animal\" : {\"name\":\"cat\" }}"
于 2012-12-26T09:06:06.770 に答える