我有一个来自URL的回复,看起来像:
{"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"}]}
Run Code Online (Sandbox Code Playgroud)
如果映射的对象是String,则获取所有更改.
ResponseEntity<String> responseEntity = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, String.class);
Run Code Online (Sandbox Code Playgroud)
然而,如果我碰巧使用自定义Value对象,有些事情如下:
public class KnChanges {
private long seq;
private String id;
private List changes;
Run Code Online (Sandbox Code Playgroud)
使用getter和setter方法,然后我只获得第一个doc更改细节.即使使用KnChanges [](数组),也只能获得第一个变化.
关于如何将上面提到的JSON列表结构映射到对象,你能帮忙吗?
谢谢哈尔莎
有些人要求提供更好的答案并进行一些解释。所以这里是:
正如 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();
Run Code Online (Sandbox Code Playgroud)
说明:
exchange 方法调用的最后一个参数定义了在收到响应时实例化的类。然后将响应数据映射到结果对象。所以你需要一个List.class拳头的地方。因为您需要一个 JSON 数组。现在您需要定义 that 的内容类型List。在这里,Java 的类型擦除给您带来了一些障碍。由于 Java 在编译时删除了泛型类型信息,因此您不能仅将预期定义List为List<KnChanges>.class. “幸运的是”有一个 hack ;) 而那个 hack 是new ParameterizedTypeReference<List<KnChanges>>() {}. 如果该对象应用程序能够在运行时读取泛型类型信息。因此能够将接收到的数据映射到您的 Java 对象。
附带说明:该 hack 有多种实现方式。它通常用于依赖注入或映射器系统,其中类型擦除有时可能是一个问题。Googles Guava 也提供了一个实现。有关更多信息,请参阅代码。如果您愿意,您还可以在那里了解它是如何完成的。
ParameterizedTypeReference<List<KnChanges>> responseType = new ParameterizedTypeReference<List<KnChanges>>() {};
ResponseEntity<List<KnChanges>> resp = restTemplate.exchange(URL, HttpMethod.GET, requestEntity, responseType);
List<KnChanges> list = resp.getBody();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10558 次 |
| 最近记录: |