2016-10-24 12 views
2

いくつかのJSONをpojoにマップしようとしています。私は実際のデータの情報を使用してそれを行う方法を見てきましたが、私の場合、データの違いを特定するものはありませんが、リストが何であるかはわかります。下の例では、私は囚人や建物のリストを取得することができますが、この場合、私は囚人のリストを取得していることを知っています。抽象クラスを使用してJSONデータの配列をPOJOに逆シリアル化するにはどうすればよいですか?

私は私がデータを持っている(私はが奇数であるが、私はJSON与えられています、私はそれを制御することはできませんネストされたデータを知っている。)

{ 
    "data": [{ 
     "data": { 
      "create_date": "2015-09-30", 
      "building": "12", 
      "dob": "2/11/1965", 
      "gender": "M", 
      "location": { 
       "zip": "10459" 
      }, 
      "name": { 
       "first": "James", 
       "last": "Bond" 

      }, 
      "id": "45" 
     }, 
     "uri": "/prisoner/45" 
    }, { 
     "data": { 
      "create_date": "2015-09-27", 
      "building": "12", 
      "dob": "12/15/1985", 
      "gender": "M", 
      "location": { 
       "zip": "10459" 
      }, 
      "name": { 
       "first": "Hans", 
       "last": "Gruber" 

      }, 
      "id": "56" 
     }, 
     "uri": "/prisoner/56" 
    }], 
    "totals": { 
     "total": 2, 
     "page": 1 
    }, 
    "links": [{ 
     "uri": "/prisoners?limit=2" 
    }] 
} 

下にJSONを与えられていますトータルオブジェクトとリンクオブジェクトを含むオブジェクト。また、ネストされたデータオブジェクト配列を含むDatumオブジェクトのコレクション(この場合はリスト)もあります。 Datumオブジェクトは存在抽象クラスとUri文字列を持っています。私は囚人ビルディング階級のものを持っています。上記のJSONでは、私は囚人のリストを取得していることを知っています。

私の現在のコード:

ObjectMapper mapper = new ObjectMapper(); 
Data data = mapper.readValue(responseJSON.toString(), Data.class); 

私はデータムに入ると囚人オブジェクトにシングオブジェクトを変更した場合、それは完璧に動作します。私の質問は、受け入れられるようにするにはどうすればいいですか受刑者または建物まだ抽象的な存在のクラスを持っているか、少なくともそれがより一般的になるようにします。Datumクラスをいくつか作ることができますが、私は1 Datumクラスを持つ方法があると信じています。私は実際に私の例では2つだけでなく、私が得ることができるデータの数十種類の異なる可能性を持っています。

答えて

4

あなたは価値観を読んだ時点で、その種類のものが何であるか知っていますか?その場合、データ(つまりData<T extends Thing>)のパラメータを設定し、型パラメータをDatumに伝播して、所有するThingのサブクラスを指定することができます。

mapper.readValue(jsonString, new TypeReference<Data<Prisoner>>(){}); 

それはObjectMapperから入手TypeFactoryを使用してパラメータ化タイプを構築することにより、動的に行うことができます。そして、あなたは次のように静的に行うことができ、あなたがreadValueを呼び出すときにパラメータ化タイプについてジャクソンを伝える必要があります。次のようなもの:

mapper.readValue("", mapper.getTypeFactory() 
          .constructParametricType(Data.class, thingSubclass)); 
関連する問題