2012-12-26 78 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