我有两个问题:
如何使用Spring RestTemplate映射JSON对象列表。 如何映射嵌套的JSON对象。
我试图消费https://bitpay.com/api/rates,从http://spring.io/guides/gs/consuming-rest/遵循教程。
我有两个问题:
如何使用Spring RestTemplate映射JSON对象列表。 如何映射嵌套的JSON对象。
我试图消费https://bitpay.com/api/rates,从http://spring.io/guides/gs/consuming-rest/遵循教程。
当前回答
在我的情况下,我更喜欢提取一个字符串,然后使用JsonNode接口浏览上下文
var response = restTemplate.exchange("https://my-url", HttpMethod.GET, entity, String.class);
if (response.getStatusCode() == HttpStatus.OK) {
var jsonString = response.getBody();
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree(jsonString);
System.out.println(actualObj);
}
或者很快
ObjectNode actualObj= restTemplate.getForObject("https://my-url", ObjectNode.class);
然后读取内部数据与路径表达式,即。
boolean b = actualObj.at("/0/states/0/no_data").asBoolean();
其他回答
也许这样……
ResponseEntity<Object[]> responseEntity = restTemplate.getForEntity(urlGETList, Object[].class);
Object[] objects = responseEntity.getBody();
MediaType contentType = responseEntity.getHeaders().getContentType();
HttpStatus statusCode = responseEntity.getStatusCode();
RequestMapping的控制器代码
@RequestMapping(value="/Object/getList/", method=RequestMethod.GET)
public @ResponseBody List<Object> findAllObjects() {
List<Object> objects = new ArrayList<Object>();
return objects;
}
ResponseEntity是HttpEntity的扩展,它添加了HttpStatus状态码。在RestTemplate和@Controller方法中使用。 在RestTemplate中,该类由getForEntity()和exchange()返回。
考虑一下这个答案,特别是如果你想在列表中使用泛型 Spring RestTemplate和泛型类型ParameterizedTypeReference集合,如List<T>
经过多次测试,这是我发现的最好的方法:)
Set<User> test = httpService.get(url).toResponseSet(User[].class);
这就是你所需要的
public <T> Set<T> toResponseSet(Class<T[]> setType) {
HttpEntity<?> body = new HttpEntity<>(objectBody, headers);
ResponseEntity<T[]> response = template.exchange(url, method, body, setType);
return Sets.newHashSet(response.getBody());
}
如果你更喜欢一个pojo列表,一种方法是这样做的:
class SomeObject {
private int id;
private String name;
}
public <T> List<T> getApi(final String path, final HttpMethod method) {
final RestTemplate restTemplate = new RestTemplate();
final ResponseEntity<List<T>> response = restTemplate.exchange(
path,
method,
null,
new ParameterizedTypeReference<List<T>>(){});
List<T> list = response.getBody();
return list;
}
像这样使用它:
List<SomeObject> list = someService.getApi("http://localhost:8080/some/api",HttpMethod.GET);
以上的解释可以在这里(https://www.baeldung.com/spring-rest-template-list)找到,并在下面进行解释。
“在上面的代码中发生了一些事情。首先,我们使用ResponseEntity作为返回类型,用它来包装我们真正需要的对象列表。其次,我们调用了RestTemplate.exchange()而不是getForObject()。
这是使用RestTemplate的最通用方式。它要求我们指定HTTP方法、可选请求体和响应类型。在本例中,我们为响应类型使用ParameterizedTypeReference的匿名子类。
最后一部分允许我们将JSON响应转换为适当类型的对象列表。当我们创建ParameterizedTypeReference的匿名子类时,它使用反射来捕获关于我们希望将响应转换为的类类型的信息。
它使用Java的Type对象保存这些信息,我们不再需要担心类型擦除。”
你可以为每个条目创建POJO,
class BitPay{
private String code;
private String name;
private double rate;
}
然后使用BitPay列表的ParameterizedTypeReference,你可以使用:
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<List<Employee>> response = restTemplate.exchange(
"https://bitpay.com/api/rates",
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<BitPay>>(){});
List<Employee> employees = response.getBody();