2012-12-26 50 views
4

{ "type":"cat", "animal":{"name":"cat"} }JSON巢类数据绑定

动物是abstract class。猫和狗是subclass

现在我试图convert json to java object并希望使用“类型”来获取子类。

但是类型字段是动物列。

感谢提前:)

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

问题是类型是除动物的{}。

如果类型在动物{}中,代码将起作用。但isn`t):

+0

所以,问题是什么? –

+0

发布一些代码,请 – Ilya

回答

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例如
编辑
在这种情况下使用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\" }}" 
+0

但类型字段不在动物中{} – Felix

+0

@Felix答案编辑 – Ilya

+0

@llya非常感谢。让我试试:) – Felix