Jacksonマルチステート処理の親クラスで子クラス宣言を行わない方法

1462 ワード

json化後、typeプロパティを使用してカスタムタイプidを記録する必要があります.
そして、逆シーケンス化の場合、このIDに基づいて自動的に実クラスに翻訳されます.
Jacksonの例はBase classに直接annotationで宣言する

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
class Animal { } 

しかし、サブクラスを宣言する方法は説明されていません.Jackson自身はクラスを自動的に検索して自己登録する機能を提供していない.
http://wiki.fasterxml.com/JacksonPolymorphicDeserialization
半日文書を調べて、実験して、以下の声明でいいです.

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
@JsonSubTypes(
  @JsonSubTypes.Type(name="dog",value=Dog.class),
  @JsonSubTypes.Type(name="cat",value=Cat.class),
  )
class Animal { } 

しかし、私はこの関係がBaseクラスで宣言されないことを望んでいます.@JsonSubTypeを使用しません.
ソースコードを見て、ドキュメントを探して、mapperを見つけます.一つの方法がある
:registerSubtypes.
試しましたが、無効です.
後でふと思ったのですが、私はサブクラスしか登録していません.ベースクラスも登録するのではないでしょうか.
やってみたら、成功・・・
関数名はregisterSubtypeなのにね[めまい]

ObjectMapper mapper = new ObjectMapper();
mapper.registerSubtypes(Animal.class);
mapper.registerSubtypes(new NamedType(Dog.class,"dog"));
mapper.registerSubtypes(new NamedType(Cat.class,"cat"));

jacksonバージョン1.9.6