2017-06-27 10 views
1

私は3つの実装を持つItemインターフェイスを持っているとしましょう。ジャクソンを使ってJSONをプロパティの存在によってポリモーフィックな型に非直列化する

interface Item { 

    String getId(); 

    // ... 
} 

class TextItem implement Item { 

    TextItem(String id, String text) { 
     // ... 
    } 

    // ... 
} 

class NumberItem implement Item { 

    NumberItem(String id, Integer number) { 
     // ... 
    } 

    // ... 
} 

class FlagItem implement Item { 

    FlagItem(String id, Boolean flag) { 
     // ... 
    } 

    // ... 
} 

それはそう、それは与えられたアイテムの種類に関連するプロパティの存在に基づいて適切な実装のインスタンスを作成しますジャクソンセットアップすることは可能ですか?

ブローJSONの例を参照してください、各項目は異なる第二の特性を有する:テキスト又はフラグ。これらのプロパティのそれぞれには、異なるデータ型も格納されています。

JSON構造を変更せずに、理想的にはif-elseベースのカスタムデシリアライザを作成しなくても、どのようにデシリアライズできますか?

{ 
    "items": [ 
     { 
      "id": "item-1", 
      "text": "some text" 
     }, 
     { 
      "id": "item-2", 
      "number": 12345 
     }, 
     { 
      "id": "item-3",, 
      "flag": true 
     } 
    ] 
} 

2番目の項目プロパティに選択されたデータ型は単なる例に過ぎません。カスタムタイプやコレクションも可能です。要点は、コンストラクターの引数型または特定の項目タイプに固有のプロパティー名の存在によって、適切な項目の実装を使用するようにJacksonを設定する方法です。

+0

これは、現在のJSONの構造では不可能である場合、2番目のプロパティは、単に異なる値の型を保持JSONで同じ名前を共有している場合、それは可能でしょうか? – topr

+0

[This](https://stackoverflow.com/a/12459070/823393)が役立ちます。私はこれまで何度かこのようなものが必要でしたし、問題を解消しました。 – OldCurmudgeon

答えて

関連する問題