8

私はRESTサービスからカテゴリーとアイテムのツリーを引き出しています。カテゴリには、カテゴリやアイテムのリストを含む「子」属性があります。それらのタイプは、フィールド「種類」で指定されます。

ジャクソンのポリモーフィック型の処理は素晴らしく、1つの小さな問題を除いて、すべて期待どおりに機能しています。「種類」フィールド自体は入力されていません。このデータをpojoに取り込む簡単な方法はありますか?カスタムデシリアライザーを作成する必要がないことを願っています。

カテゴリとアイテムの基本クラスは次のとおりです。2つのサブクラスは、いくつかのスカラー場を追加しますが、あまり興味深いものではありません。

@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アノテーションには「visible」属性があります。

@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 。

于 2012-11-30T02:35:30.373 に答える