java - RestTemplate getForEntity 映射到对象列表

标签 java resttemplate

我有一个来自 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"}]}

如果映射对象是字符串,则获取所有更改提要。

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 方法,然后我只获得第一个文档更改详细信息。即使使用了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();

解释:

交换方法调用的最后一个参数定义了在收到响应时实例化的类。然后将响应数据映射到结果对象。所以你需要一个 List.class在拳头的地方。因为您需要一个 JSON 数组。现在您需要定义 List 的内容类型.这里Java's type erasure在你的路上扔一些石头。由于 Java 在编译时删除了泛型类型信息,因此您不能只定义预期的 List。成为List<KnChanges>.class . “幸运的是”有一个 hack ;)那个 hack 是 new ParameterizedTypeReference<List<KnChanges>>() {} .只要该对象,应用程序就能够在运行时读取通用类型信息。因此能够将接收到的数据映射到您的 Java 对象。

作为旁注:该 hack 有多种实现。它通常用于依赖注入(inject)或映射器系统,其中类型删除有时可能是一个问题。 Googles Guava 也提供了一个实现。 See the code想要查询更多的信息。如果愿意,您还可以在那里了解它是如何完成的。

关于java - RestTemplate getForEntity 映射到对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30936863/

相关文章:

javascript - 如何使用 Spring Boot 将回调方法从 JavaScript 传递到 java 后端?

java - float 型最多可容纳38个数字,双型最多可容纳300个数字。这些神奇的数字从何而来?

java - 如何在不映射驱动器的情况下创建代表 Windows 服务器上路径的文件?

java - 如何从一个类调用另一个类的对象

java - Spring RestTemplate 遵循带有 cookie 的重定向

java - RestTemplate 获取对象列表 - 为什么使用 ParameterizedTypeReference 而不是对象数组?

java - 为了避免异常,请禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS)

java - 如何使用Spring RestTemplate处理json类型请求和xml类型请求

java - 调用子类方法?

java - Rest 模板请求被主机中的软件中止