2016-10-06 9 views
3

私はこのような応答を得る:春ブーツRestTemplate一覧

{ 
    "data":[ 
     { 
     "object1":"example", 
     "object2":"example", 
     "object3":"example", 
     "object4":"example", 
     "object5":"example" 
     }, 
     { 
     "object1":"example", 
     "object2":"example", 
     "object3":"example" 
     } 
    ] 
} 

は今、私は私のクラスのDTOにこのデータをマップしたかったが、DTOは何dataフィールドを持っていないので、私は「エラー」そこに着きます。私はそれをListまたは私のクラスの配列に入れたいです。 Like:

List<MyClass> list = restTemplate.getForObject(url, MyClass.class); 

私はあなたが私の言いたいことを願っていますか?

+0

私はあなたのrデータ[0]キーが完全であり、間違っているので、応答jsonは間違っています。私たちはjsonがユニークなキーを持つべきであることを知っ値は同じにすることができます。 –

+0

jsonの上にコピーしてjson editorに入れたら、どういう意味だろうか –

+0

JSONオブジェクトは有効です。実際には他のオブジェクトが存在するという "parma"の例を編集したばかりです –

答えて

2

JSONレスポンスをMap<String, List<MyClass>>に変換してから、map.get("data")というマップにクエリして実際のList<MyClass>を取得する方法があります。

Map<String, List<MyClass>>にJSONレスポンスを変換するために、あなたはタイプリファレンス定義する必要があります。

ResponseEntity<Map<String, List<MyClass>>> response = 
           restTemplate.exchange(url, HttpMethod.GET, null, typeRef); 

ParameterizedTypeReference<Map<String, List<MyClass>>> typeRef = 
          new ParameterizedTypeReference<Map<String, List<MyClass>>>() {}; 

を次に、以下のようなexchange方法にtypeRefことを渡します最後に:

System.out.println(response.getBody().get("data")); 

なぜタイプリファレンスが必要なのか疑問に思うなら、Neal Gafterの記事Super Type Tokensを読むことを検討してください。

更新:あなたは次のスキーマデシリアライズするつもりなら:

{ 
    "data": [], 
    "paging": {} 
} 

をそれは次のようなダムのコンテナクラスを作成すると良いでしょう:

class JsonHolder { 
    private List<MyClass> data; 
    private Object paging; // You can use custom type too. 

    // Getters and setters 
} 

その後、あなたにそれを使用しますRestTemplate通話:

JsonHolder response = restTemplate.getForObject(url, JsonHolder.class); 
System.out.println(response.getData()); // prints a List<MyClass> 
System.out.println(response.getPaging()); // prints an Object 
+0

ありがとう、これを変数リストにマップするにはどうすればいいですか? –

+0

私は、 'RestTemplate'だけが関わっ​​ていると思っています。あなたはジャクソンを直接使用して、手動でJSON文字列を 'List ' –

+1

にデシリアライズする必要があると思います。 –