Pregunta Obtener una lista de objetos JSON con Spring RestTemplate


Tengo dos preguntas:

  • Cómo mapear una lista de objetos JSON utilizando Spring RestTemplate.
  • Cómo mapear objetos JSON anidados.

Estoy tratando de consumir https://bitpay.com/api/rates, siguiendo el tutorial de http://spring.io/guides/gs/consuming-rest/.


147
2018-05-15 09:17


origen


Respuestas:


Quizás de esta manera ...

ResponseEntity<Object[]> responseEntity = restTemplate.getForEntity(urlGETList, Object[].class);
Object[] objects = responseEntity.getBody();
MediaType contentType = responseEntity.getHeaders().getContentType();
HttpStatus statusCode = responseEntity.getStatusCode();

Código de controlador para el RequestMapping

@RequestMapping(value="/Object/getList/", method=RequestMethod.GET)
public @ResponseBody List<Object> findAllObjects() {

    List<Object> objects = new ArrayList<Object>();
    return objects;
}

ResponseEntity es una extensión de HttpEntity eso agrega un HttpStatus código de estado. Utilizada en RestTemplate también @Controller métodos. En RestTemplate esta clase es devuelta por getForEntity() y exchange().


160
2018-05-15 10:18



Primero defina un objeto para mantener a la entidad regresando en la matriz ... ej.

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

Luego puede consumir el servicio y obtener una lista fuertemente tipada a través de:

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

Las otras soluciones anteriores también funcionarán, pero me gusta obtener una lista fuertemente tipada en lugar de un Objeto [].


243
2017-08-11 16:29



Para mí esto funcionó

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

Donde Object es la clase que quieres


59
2017-11-07 07:25



Después de múltiples pruebas, esta es la mejor forma que encontré :)

Set<User> test = httpService.get(url).toResponseSet(User[].class);

Todo lo que necesitas allí

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

3
2017-09-12 13:02



Mi gran problema aquí fue construir la estructura Object necesaria para unir RestTemplate a una clase compatible. Afortunadamente encontré http://www.jsonschema2pojo.org/ (obtenga la respuesta JSON en un navegador y utilícela como entrada) ¡y no puedo recomendar esto lo suficiente!


1
2018-01-29 23:33



Encontré trabajo alrededor de esta publicación https://jira.spring.io/browse/SPR-8263.

Según esta publicación, puede devolver una lista mecanografiada como esta:

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

-1
2018-05-14 21:44