如何使用jackson将Json String转换为带有泛型的Java Bean

时间:2013-06-09 03:20:34

标签: json jackson

class A<T extends Animal>{
  @XmlElement
  T animal;
}

@XmlRootElement(name="animal")
class Animal{
}

//@XmlRootElement(name="Birds")
class Birds extends Animal{
 ArrayList<String> someNames;
relavant fields ..with getter/setter and annotation
}

//@XmlRootElement(name="Fish")
class Fish extends Animal{
relavant fields ..with getter/setter and annotation
}

我可以使用org.codehaus.jackson将Bean转换为Json String。但是当我尝试使用org.codehaus.jackson

将Json String转换回Java Bean时
JsonFactory jf = new JsonFactory(); 
JsonParser jp = null;

A<Bird> bird = null;
bird = inputMapper.readValue(jp, A.class);

我得到了

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "someNames" .

我已经在getter和setter上添加了@XmlElement注释。

1 个答案:

答案 0 :(得分:0)

找到解决方案 http://programmerbruce.blogspot.in/2011/05/deserialize-json-with-jackson-into.html

参见上述链接的示例4。通过放置2个注释@JsonTypeInfo和@JsonSubTypes,问题就解决了。

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "type")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Birds.class, name = "birds"),
        @JsonSubTypes.Type(value = Fish.class, name = "fish") })
@XmlRootElement(name="animal")
class Animal{
}

请注意注释"type"中的@JsonTypeInfo参数。

1)序列化时,杰克逊框架引入了"type" param。

对于Birds实例,"type"被引入为"animal":{"type":"birds", "":"" ....}

同样,在鱼类"type"的情况下,"animal":{"type":"fish", "":"" ....}

被引入

2)在反序列化时,Jackson Framework使用"type"参数在运行时实例化多态通用实例bean。