我从REST服务中提取了一个类别和项目树。类别具有“子”属性,该属性包含类别和/或项目列表。它们的类型在“kind”字段中指定。
杰克逊的多态类型处理很棒,所有工作都按预期工作,除了一个小故障:“种类”字段本身没有填充。有没有一种简单的方法可以将这些数据输入pojos?我希望不必编写自定义反序列化器。
这是Category和Item的基类。这两个子类添加了几个标量字段,并不是很有趣。
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "kind",
defaultImpl = EntityBase.Impl.class
)
@JsonSubTypes({
@Type(value = Item.class, name = "Item"),
@Type(value = Category.class, name = "Category")
})
public abstract class EntityBase {
String title;
String kind;
public void setTitle(String title) { this.title = title; }
public String getTitle() { return title; }
public void setKind(String kind) { this.kind = kind; }
public String getKind() { return kind; }
public static class Impl extends EntityBase {}
}
我正在使用类似这样的ObjectMapper进行反序列化:
ObjectMapper mapper = new ObjectMapper();
Category category = mapper.readValue(inputStream, Category.class);
我认为这是无关紧要的,它甚至不值得一个标签,但为了以防万一,这是在一个Android应用程序。
答案 0 :(得分:11)
像往常一样,我在发布此问题之前花了几分钟时间进行搜索,以确保我没有错过任何明显的内容。
我不会说它很明显,但我跟踪了a resolved jira ticket的答案。该票据在http://jackson-users.ning.com/的帖子下的评论中被链接,但我已经丢失了该帖子的链接。
JsonTypeInfo注释中有一个“可见”属性,它就是这样做的。
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "kind",
visible = true, // <----- add this
defaultImpl = EntityBase.Impl.class
)
public abstract class EntityBase {
...
}
事实证明,这是在javadocs中记录的。由于旧的1.5文档上的优秀SEO(以及jackson.codehaus.org和fasterxml.com之间令人困惑的二分法没有帮助),我错过了它,但现在我已经吸取了教训,而且我正在查看文档在这里:http://wiki.fasterxml.com/JacksonJavaDocs。