Eu tenho duas perguntas:
- Como mapear uma lista de objetos JSON usando o Spring RestTemplate.
- Como mapear objetos JSON aninhados.
Estou tentando consumir https://bitpay.com/api/rates , seguindo o tutorial em http://spring.io/guides/gs/consuming-rest/ .
java
spring
resttemplate
Karudi
fonte
fonte
Respostas:
Talvez assim ...
Código do controlador para o
RequestMapping
ResponseEntity
é uma extensãoHttpEntity
que adiciona umHttpStatus
código de status. UsadoRestTemplate
também em@Controller
métodos. EmRestTemplate
esta classe é retornado porgetForEntity()
eexchange()
.fonte
Primeiro defina um objeto para manter a entidade retornando à matriz.
Em seguida, você pode consumir o serviço e obter uma lista fortemente tipada via:
As outras soluções acima também funcionarão, mas eu gosto de obter uma lista fortemente tipada de volta em vez de um Object [].
fonte
restTemplate.exchange
um marshallar mapeia todos os valores json para os nomes de chaves correspondentes como propriedades no objeto Rate. Espero que meu processo de pensamento esteja correto.Para mim isso funcionou
Onde Object é a classe que você deseja
fonte
Coupon[] coupons = restTemplate.getForObject( url, Coupon[].class)
[]
mas totalmente vazio). Portanto, tenha cuidado e verifiquenull
(if (forNow != null)...
).Object.class
é especificado no métodogetForObject()
.Após vários testes, esta é a melhor maneira que encontrei :)
Tudo o que você precisa lá
fonte
Meu grande problema aqui foi criar a estrutura de objetos necessária para corresponder o RestTemplate a uma classe compatível. Felizmente eu encontrei http://www.jsonschema2pojo.org/ (obtenha a resposta JSON em um navegador e use-a como entrada) e não posso recomendar isso o suficiente!
fonte
Na verdade, eu desenvolvi algo funcional para um dos meus projetos antes e aqui está o código:
Espero que isso ajude alguém!
fonte
Se você preferir uma lista de objetos, uma maneira de fazer isso é assim:
E use-o assim:
A explicação para o acima pode ser encontrada aqui ( https://www.baeldung.com/spring-rest-template-list ) e é parafraseada abaixo.
"Há algumas coisas acontecendo no código acima. Primeiro, usamos ResponseEntity como nosso tipo de retorno, para envolvê-la na lista de objetos que realmente queremos. Segundo, estamos chamando RestTemplate.exchange () em vez de getForObject () .
Essa é a maneira mais genérica de usar o RestTemplate. Ele exige que especifiquemos o método HTTP, o corpo opcional da solicitação e um tipo de resposta. Nesse caso, usamos uma subclasse anônima de ParameterizedTypeReference para o tipo de resposta.
Esta última parte é o que nos permite converter a resposta JSON em uma lista de objetos do tipo apropriado. Quando criamos uma subclasse anônima de ParameterizedTypeReference, ele usa reflexão para capturar informações sobre o tipo de classe para o qual queremos converter nossa resposta.
Ele se apega a essas informações usando o objeto Type do Java e não precisamos mais nos preocupar com o apagamento do tipo ".
fonte
Considere ver esta resposta, especialmente se você quiser usar genéricos no
List
Spring RestTemplate e tipos genéricos ParameterizedTypeReference coleções como List <T>fonte
Você pode criar POJO para cada entrada, como
usando ParameterizedTypeReference of List of BitPay, você pode usar como:
fonte
Encontrei uma solução alternativa para este post https://jira.spring.io/browse/SPR-8263 .
Com base nesta postagem, você pode retornar uma lista digitada assim:
fonte
getForEntity
. Também(Class<? extends ArrayList<User>>) ArrayList.class
fornece um erro de compilação "tipos incompatíveis".