8

我正在从 REST 服务中提取类别和项目树。类别具有包含类别和/或项目列表的“子”属性。它们的类型在“种类”字段中指定。

Jackson 的多态类型处理非常棒,所有工作都按预期工作,除了一个小问题:“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 应用程序中。

4

1 回答 1

11

像往常一样,我在发布这个问题之前花了几分钟搜索,以确保我没有错过任何明显的东西。

我不会说它很明显,但我找到了一张带有答案的已解决的 jira 票。该票在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 和 fastxml.com 之间令人困惑的二分法没有帮助),但现在我已经吸取了教训,我正在查看文档这里: http ://wiki.fasterxml.com/JacksonJavaDocs 。

于 2012-11-30T02:35:30.373 回答