用Spring RestTemplate获取JSON对象列表
我有两个问题:
- 如何使用Spring RestTemplate映射JSON对象的列表。
- 如何映射嵌套的JSON对象。
我试图通过遵循http://spring.io/guides/gs/consuming-rest/中的教程来使用https://bitpay.com/api/rates 。
也许这样…
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
的扩展,增加了一个HttpEntity
状态码。 用于RestTemplate
以及@Controller
方法。 在RestTemplate
这个类由getForEntity()
和exchange()
。
首先定义一个对象来保存数组返回的实体
@JsonIgnoreProperties(ignoreUnknown = true) public class Rate { private String name; private String code; private Double rate; // add getters and setters }
然后,您可以使用该服务,并通过以下方式获取强types列表:
ResponseEntity<List<Rate>> rateResponse = restTemplate.exchange("https://bitpay.com/api/rates", HttpMethod.GET, null, new ParameterizedTypeReference<List<Rate>>() { }); List<Rate> rates = rateResponse.getBody();
上面的其他解决scheme也将工作,但我喜欢得到一个强types的列表,而不是一个对象[]。
对我来说这工作
Object[] forNow = template.getForObject("URL", Object[].class); searchList= Arrays.asList(forNow);
哪里对象是你想要的类
经过多次testing,这是我发现的最佳方式:)
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()); }
我从这个postfind了解决办法https://jira.spring.io/browse/SPR-8263 。
根据这篇文章,你可以返回一个类似于这样的列表:
ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId);