Tengo dos preguntas:
- Cómo mapear una lista de objetos JSON usando 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/ .
java
spring
resttemplate
Karudi
fuente
fuente
Respuestas:
Quizás de esta manera ...
Código de controlador para el
RequestMapping
ResponseEntity
es una extensión deHttpEntity
que agrega unHttpStatus
código de estado. UtilizadoRestTemplate
también en@Controller
métodos. EnRestTemplate
esta clase es devuelto porgetForEntity()
yexchange()
.fuente
Primero defina un objeto para contener la entidad que regresa a la matriz. Ej.
Entonces puede consumir el servicio y obtener una lista fuertemente tipada a través de:
Las otras soluciones anteriores también funcionarán, pero me gusta recuperar una lista fuertemente tipada en lugar de un Object [].
fuente
restTemplate.exchange
un marshallar asigna todos los valores json a los nombres de claves coincidentes como propiedades en el objeto Rate. Espero que mi proceso de pensamiento sea correcto.Para mi esto funcionó
Donde Object es la clase que quieres
fuente
Coupon[] coupons = restTemplate.getForObject( url, Coupon[].class)
[]
pero totalmente vacío). Así que tenga cuidado y verifiquenull
(if (forNow != null)...
).Object.class
se especifica en el métodogetForObject()
.Después de múltiples pruebas, esta es la mejor manera que encontré :)
Todo lo que necesitas allí
fuente
Mi gran problema aquí fue construir la estructura de Objeto requerida para hacer coincidir RestTemplate con una Clase compatible. Afortunadamente encontré http://www.jsonschema2pojo.org/ (obtengo la respuesta JSON en un navegador y la uso como entrada) y no puedo recomendarlo lo suficiente.
fuente
De hecho, desarrollé algo funcional para uno de mis proyectos antes y aquí está el código:
¡Espero que esto ayude a alguien!
fuente
Si prefiere una Lista de objetos, una forma de hacerlo es así:
Y úsalo así:
La explicación de lo anterior se puede encontrar aquí ( https://www.baeldung.com/spring-rest-template-list ) y se parafrasea a continuación.
"Hay un par de cosas que suceden en el código anterior. Primero, usamos ResponseEntity como nuestro tipo de retorno, usándolo para ajustar la lista de objetos que realmente queremos. Segundo, estamos llamando a RestTemplate.exchange () en lugar de getForObject () .
Esta es la forma más genérica de usar RestTemplate. Requiere que especifiquemos el método HTTP, el cuerpo de solicitud opcional y un tipo de respuesta. En este caso, utilizamos una subclase anónima de ParameterizedTypeReference para el tipo de respuesta.
Esta última parte es lo que nos permite convertir la respuesta JSON en una lista de objetos que son del tipo apropiado. Cuando creamos una subclase anónima de ParameterizedTypeReference, utiliza la reflexión para capturar información sobre el tipo de clase al que queremos convertir nuestra respuesta.
Conserva esta información utilizando el objeto Type de Java, y ya no tenemos que preocuparnos por el borrado de tipo ".
fuente
Considere ver esta respuesta, especialmente si desea usar genéricos en
List
Spring RestTemplate y tipos genéricos ParameterizedTypeReference colecciones como List <T>fuente
Puede crear POJO para cada entrada como,
luego usando ParameterizedTypeReference of List of BitPay puede usarlo como:
fuente
Encontré trabajo en esta publicación https://jira.spring.io/browse/SPR-8263 .
Según esta publicación, puede devolver una lista escrita como esta:
fuente
getForEntity
. También(Class<? extends ArrayList<User>>) ArrayList.class
da un error de compilación de "tipos incompatibles".