Jackson 2.1多态反序列化:如何在pojo上填充类型字段?

时间:2012-11-30 02:35:30

标签: java jackson

我从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应用程序。

1 个答案:

答案 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