RestTemplate getForEntity映射到对象列表

时间:2015-06-19 11:19:22

标签: java resttemplate

我的网址回复如下:

{"seq":1,"id":"Test1","changes":[{"rev":"1-52f5cdf008ecfbadf621c2939af7bd80"}]}
{"seq":2,"id":"Test2","changes":[{"rev":"1-8ce403a89dc5e7cb4187a16941b3fb7d"}]}
{"seq":3,"id":"Test3","changes":[{"rev":"1-52as7ddfd8ecfbadf621c2939af7bd80"}]}
{"seq":4,"id":"Test4","changes":[{"rev":"1-6yy03a89dc5e7cb45677a16941b3fb7d"}]}

如果映射的对象是String,则获取所有更改。

ResponseEntity<String> responseEntity = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, String.class);

然而,如果我碰巧使用自定义的Value对象,可能会出现以下情况:

public class KnChanges {
private long seq;
private String id;
private List changes;

使用getter和setter方法,然后我只获得第一个doc更改细节。即使使用KnChanges [](数组),也只能获得第一个更改。

关于如何将上面提到的JSON列表结构映射到对象,你能帮忙吗?

由于 戒日

2 个答案:

答案 0 :(得分:5)

ParameterizedTypeReference<List<KnChanges>> responseType = new ParameterizedTypeReference<List<KnChanges>>() {};
ResponseEntity<List<KnChanges>> resp = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, responseType);
List<KnChanges> list = resp.getBody();

答案 1 :(得分:4)

有些人通过一些解释要求更好的答案。所以这就是:

正如sujim所提到的:你需要

ParameterizedTypeReference<List<KnChanges>> responseType = new ParameterizedTypeReference<List<KnChanges>>() {};
ResponseEntity<List<KnChanges>> resp = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, responseType);
List<KnChanges> list = resp.getBody();

<强>阐释:

交换方法调用的最后一个参数定义了在收到响应时实例化的类。然后,响应数据将映射到结果对象。所以你需要一个List.class的拳头位置。因为你期望一个JSON数组。现在,您需要定义List的内容类型。在这里,Java's type erasure会在你的方向投掷一些石块。由于Java在编译时删除了泛型类型信息,因此您无法将预期的List定义为List<KnChanges>.class。 &#34;幸运的是&#34;有一个黑客;)那个黑客是new ParameterizedTypeReference<List<KnChanges>>() {}。只要对象应用程序能够在运行时读取泛型类型信息。因此能够将收到的数据映射到Java对象。

作为旁注:有一些黑客的实现。它通常用于依赖注入或映射器系统,其中类型擦除有时可能是一个问题。 Googles Guava也提供了一个实现。 See the code了解更多信息。如果你愿意,你也可以在那里了解它是如何完成的。