2012-03-02 14 views
2

ジャクソンを使用してJSONをJava POJOにデシリアライズしています。私はオブジェクトマッパーでMrBeanモジュールを登録しています。したがって、私がしなければならないことは、たくさんのインターフェースを定義することだけです。POJOはこれらのインターフェースに基づいて自動的に生成されます。ジャーナル(とMrBean)の逆シリアル化時の多態性の使用

私は、Credentialsインターフェースを持ち、それを拡張するさまざまなタイプの資格情報を持っていたいと思います。 UsernamePasswordCredentialsとCertificateFileCredentialsです。私もfollowed the instructions at another StackOverflow postきた

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "username" (Class org.codehaus.jackson.generated.SCRUBBED.Credentials), not marked as ignorable 
at [Source: [email protected]; line: 32, column: 29] (through reference chain: HostConfiguration["hostDefinitions"]->HostDefinition["credentials"]->Credentials["username"]) 

、と私は同じエラーを取得しています:

それが仕事にしようとするために、任意の注釈や他の呪文なしでこれを行うと、私のユニットテストで私に次のエラーを与えます。

エラーは意味があります。 JacksonはJSONファイルの内容を空のインターフェイスにマップしようとしています。しかし、私は(おそらく、おそらく)ジャクソンがベースのクレデンシャルインターフェースを拡張し、それらのインターフェースのフィールドをJSONオブジェクトで見つかったフィールドにマッチさせるためのインターフェースを探すことを期待していました。

JSONオブジェクトのメタ情報を利用するいくつかの例をJackson wikiで見てきました。オブジェクトを"@class":"foo.bar.CertificateFileCredentials"でデコレートしていますが、JSON入力が他のサービスによって自動的に生成され、他のサービスが自分のサービスの内部について何も知っていてはいけないので、これを避けることをお勧めします。

ありがとうございます!

答えて

0

実際の実装クラスをどのように定義しますか?追加インターフェイスとして?それらは正しく生成されるはずです。デシリアライゼーション中に問題が発生します。デシリアライザが複数の選択肢がある場合、使用する実際のタイプを見つけるための方法が必要です。 これについては、気づいたように@JsonTypeInfoを使用することをお勧めします。

0

実際には、JSONを生成するサービスを制御していなくても、このテクニックはあなたの目的にも適しています。

@JsonTypeInfoを使用する場合、クラス名を保存するのが簡単なデフォルトですが、Jacksonはこれを好みに合わせてカスタマイズできます。例えば

、サービスはこのようになりますJSONを生成したとします

{ meows: 400, furColor: "green", species: "cat" } 

その後、あなたはそれを正しく変換するために、これらのインタフェースを定義することができます。

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY,property="species") 
@JsonSubTypes({ 
     @JsonSubTypes.Type(value=Feline.class, name="cat") 
}) 
public interface Animal { 
    public String getFurColor(); 
} 

@JsonTypeName("cat") 
public interface Feline extends Animal { 
    @JsonProperty("meows") // just to have an example of a renamed property... 
    public long getMeowingVolumeInDecibels(); 
} 

次に、あなただけ自動的にデシリアライズするとき、実行時に右のJava型を取得するだけでなく、自動的に実行時の型に応じて、「種」プロパティを生成する必要があります。希望が助けてくれる!

関連する問題