2011-04-18 15 views
8

ジャクソンライブラリを使用してJSONからデシリアライズしている間に、デフォルトのコンストラクタを呼び出すことなく、カスタム方法でBeanをインスタンス化する最も簡単で簡単な方法は何ですか?私は実現可能なJsonDeserializerインターフェイスがあることを知りましたが、あまりにもすべて一緒にObjectMapperに配線する方法はわかりません。Jacksonとカスタム方法でBeanをインスタンス化する方法は?

更新日1:私の質問にはさらに詳細が必要だと思います。デフォルトでは、Jacksonのデシリアライザはデフォルトのコンストラクタを使用して豆を作ります。私は、外部ファクトリを呼び出してBeanのインスタンス化を実装できるようにしたいと考えています。だから私が必要とするのは、インスタンス化する必要のあるBeanのクラスです。ファクトリはインスタンスを返し、プロパティの追加などのためにジャクソンに提供することができます。

私は文字列や数字などの単純な/スカラー値の作成については心配していませんが、興味のある領域には豆だけがあります。

@JsonDeserialize(using = PropertyValueDeserializer.class) 
public class PROPERTY_VALUE implements Serializable{ 

、その後のことができます。例えばデシリアライザで:

答えて

0

は、あなたはJSONはにマッピングされて取得したいJavaオブジェクトにデシリアライザを置きます操作を行います。

@Override 
public PROPERTY_VALUE deserialize(JsonParser jsonParser, 
        DeserializationContext deserializationContext) 
      throws IOException, JsonProcessingException { 

    String tmp = jsonParser.getText(); // { 
    jsonParser.nextToken(); 
    String key = jsonParser.getText(); 
    jsonParser.nextToken(); 
    String value = jsonParser.getText(); 
    jsonParser.nextToken(); 
    tmp = jsonParser.getText(); // } 

    PROPERTY_VALUE pv = new PROPERTY_VALUE(key,value); 
    return pv; 
} 

あなたは注釈を使用したくない場合は、指定されたタイプのために右のデシリアライザを提供することができマッパーDeserializerProviderを渡す必要があります。

コンストラクタについては
mapper.setDeserializerProvider(myDeserializerProvider); 

- もちろん、あなたは、デシリアライザ内の工場を呼び出すことによって、対象となるクラスを生成できます。

String value = jsonParser.getText(); 
    jsonParser.nextToken(); 
    tmp = jsonParser.getText(); // } 

    MyObject pv = MyObjectFactory.get(key); 
    pv.setValue(value); 
    return pv; 
} 

しかし、私はそれかもしれ

+0

ありがとうございます。 JacksonはデフォルトでBeanのデフォルトのコンストラクタを使用してインスタンスを作成します。私がしたいのは、実際に外部ファクトリを使用してBeanを作成することです。私は質問をいくつかの詳細で一瞬で更新します。 –

+0

注釈を使用しないで私はどのようにできるのですか? –

+1

ミックスインアノテーションを使用することにより、クラス自体に直接追加する必要はなく、他の「ミックスイン」クラスに追加できます。これにより、サードパーティのライブラリでアノテーションアプローチを使用することが可能になります。 – StaxMan

8

いくつかのことを、あなたの更新を誤解している可能性がhelp ...

まず、@ JsonCreatorを使用して、使用する代替コンストラクタを定義できます(バイトコードには@JsonPropertyアノテーションが必要です)。名前なし)、または静的なファクトリです。それでも値クラスの一部になりますが、不変オブジェクトをサポートするのに役立ちます。

第2に、本当にカスタムのデシリアライズ処理が必要な場合は、http://wiki.fasterxml.com/JacksonHowToCustomDeserializersでカスタムデシリアライザの登録方法を確認できます。

Jacksonが現在欠場していることの1つは、ビルダースタイルのオブジェクトのサポートです。サポートを追加する機能リクエストがあります(また、開発者が時間を過ぎるとサポートを追加する予定です)。

関連する問題