2012-11-30 10 views
7

RESTサービスからカテゴリとアイテムのツリーを取得しています。カテゴリには、カテゴリおよび/またはアイテムのリストを含む「子」属性があります。それらの型は "kind"フィールドで指定されます。Jackson 2.1ポリモーフィックなデシリアライゼーション:pojoに型フィールドを設定する方法は?

ジャクソンの多型性の取り扱いはすばらしく、いずれも小さなヒッチを除いてすべて期待どおりに動作します。「種類」フィールド自体には値が設定されていません。このデータをpojosに取り込む簡単な方法はありますか?私はカスタムデシリアライザを書く必要がないことを願っています。

ここは、カテゴリとアイテムの基本クラスです。 2つのサブクラスはいくつかのスカラーフィールドを追加し、非常に興味深いものではありません。

私はこのようなObjectMapper何かを直列化復元をやっている
@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 mapper = new ObjectMapper(); 
Category category = mapper.readValue(inputStream, Category.class); 

Androidアプリ

答えて

10

いつものように、この質問を投稿する直前に検索を数分過ごして、明らかに何かを見逃していないことを確認しました。

私はそれを明らかにしませんでしたが、回答でa resolved jira ticketを追跡しました。チケットは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の文書(およびjackson.codehaus.orgとfasterxml.comの間の混乱した二分法)が優れたSEOのおかげでそれを見逃していましたが、今は私のレッスンを学びました。私はdocsここに:http://wiki.fasterxml.com/JacksonJavaDocs

+1

優れた探偵作品! – StaxMan

+0

数時間前にこの正確な問題に遭遇しました - あなたは私の髪の毛が残っているものを保存しました!けっ! – tbm

関連する問題