-1
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 注释。

4

1 回答 1

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"参数由 Jackson 框架引入。

在 Birds 实例的情况下,"type"引入为 "animal":{"type":"birds", "":"" ....}

类似地,在 Fish 的情况下"type"引入为 "animal":{"type":"fish", "":"" ....}

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

于 2013-06-09T19:02:17.013 回答