Получить список объектов JSON с помощью Spring RestTemplate


У меня есть два вопроса:

  • как отобразить список объектов JSON с помощью Spring RestTemplate.
  • как сопоставить вложенные объекты JSON.

Я пытаюсь потреблять https://bitpay.com/api/rates, следуя учебнику из http://spring.io/guides/gs/consuming-rest/.

6 151

6 ответов:

может быть этот путь...

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().

сначала определите объект для хранения сущности, возвращающейся в массив.. например,

@JsonIgnoreProperties(ignoreUnknown = true)
public class Rate {
    private String name;
    private String code;
    private Double rate;
    // add getters and setters
}

затем вы можете использовать сервис и получить строго типизированный список через:

ResponseEntity<List<Rate>> rateResponse =
        restTemplate.exchange("https://bitpay.com/api/rates",
                    HttpMethod.GET, null, new ParameterizedTypeReference<List<Rate>>() {
            });
List<Rate> rates = rateResponse.getBody();

другие решения выше также будут работать, но мне нравится получать строго типизированный список вместо объекта[].

для меня это работал

Object[] forNow = template.getForObject("URL", Object[].class);
    searchList= Arrays.asList(forNow);

где объект-это класс, который вы хотите

после нескольких тестов, это лучший способ, который я нашел :)

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());
}

моей большой проблемой здесь было построить структуру объекта, необходимую для соответствия RestTemplate совместимому классу. К счастью, я нашел http://www.jsonschema2pojo.org/ (получить ответ JSON в браузере и использовать его в качестве ввода), и я не могу рекомендовать это достаточно!

Я нашел работу вокруг от этого поста https://jira.spring.io/browse/SPR-8263.

на основе этого сообщения Вы можете вернуть типизированный список следующим образом:

ResponseEntity<? extends ArrayList<User>> responseEntity = restTemplate.getForEntity(restEndPointUrl, (Class<? extends ArrayList<User>>)ArrayList.class, userId);