Mam dwa pytania:
- Jak zmapować listę obiektów JSON przy użyciu Spring RestTemplate.
- Jak mapować zagnieżdżone obiekty JSON.
Staram się konsumować https://bitpay.com/api/rates , postępując zgodnie z samouczkiem z http://spring.io/guides/gs/consuming-rest/ .
java
spring
resttemplate
Karudi
źródło
źródło
Odpowiedzi:
Może w ten sposób ...
Kod kontrolera dla
RequestMapping
ResponseEntity
jest rozszerzeniem tego,HttpEntity
który dodajeHttpStatus
kod statusu. UżywanyRestTemplate
również w@Controller
metodach. WRestTemplate
tej klasie zwracany jest przezgetForEntity()
iexchange()
.źródło
Najpierw zdefiniuj obiekt, aby zatrzymać byt wracający do tablicy. Np
Następnie możesz skorzystać z usługi i uzyskać silnie wpisaną listę za pośrednictwem:
Inne powyższe rozwiązania również będą działać, ale lubię odzyskiwać mocno wpisaną listę zamiast Object [].
źródło
restTemplate.exchange
marshallar mapuje wszystkie wartości JSON na pasujące nazwy kluczy jako właściwości w obiekcie Rate. Mam nadzieję, że mój proces myślowy jest prawidłowy.Dla mnie to zadziałało
Gdzie Object to klasa, którą chcesz
źródło
Coupon[] coupons = restTemplate.getForObject( url, Coupon[].class)
[]
ale nie całkowicie pusta). Więc bądź ostrożny i sprawdźnull
(if (forNow != null)...
).Object.class
jest określony w metodziegetForObject()
.Po wielu testach jest to najlepszy sposób, jaki znalazłem :)
Wszystko czego potrzebujesz
źródło
Moim wielkim problemem tutaj było zbudowanie struktury Object wymaganej do dopasowania RestTemplate do kompatybilnej klasy. Na szczęście znalazłem http://www.jsonschema2pojo.org/ (pobierz odpowiedź JSON w przeglądarce i użyj jej jako danych wejściowych) i nie mogę tego wystarczająco polecić!
źródło
faktycznie opracowałem coś funkcjonalnego dla jednego z moich projektów i oto kod:
Mam nadzieję, że to komuś pomoże!
źródło
Jeśli wolisz listę obiektów, możesz to zrobić w następujący sposób:
I użyj go w ten sposób:
Wyjaśnienia dotyczące powyższego można znaleźć tutaj ( https://www.baeldung.com/spring-rest-template-list ), a ich parafrazę podano poniżej.
„W powyższym kodzie dzieje się kilka rzeczy. Po pierwsze, używamy ResponseEntity jako naszego typu zwracanego, używając go do zawijania listy obiektów, których naprawdę chcemy. Po drugie, wywołujemy RestTemplate.exchange () zamiast getForObject () .
Jest to najbardziej ogólny sposób użycia RestTemplate. Wymaga od nas określenia metody HTTP, opcjonalnego treści żądania i typu odpowiedzi. W tym przypadku używamy anonimowej podklasy ParameterizedTypeReference dla typu odpowiedzi.
Ta ostatnia część pozwala nam przekonwertować odpowiedź JSON na listę obiektów odpowiedniego typu. Kiedy tworzymy anonimową podklasę ParameterizedTypeReference, wykorzystuje ona refleksję do przechwytywania informacji o typie klasy, na który chcemy przekonwertować naszą odpowiedź.
Przechowuje te informacje za pomocą obiektu Type w Javie i nie musimy się już martwić o usunięcie typu ”.
źródło
Rozważ zobacz tę odpowiedź, szczególnie jeśli chcesz używać ogólnych w
List
Spring RestTemplate i ogólnych typów ParameterizedTypeReference, takich jak List <T>źródło
Możesz utworzyć POJO dla każdego wpisu, np.
następnie używając ParameterizedTypeReference z listy BitPay możesz użyć jako:
źródło
Znalazłem obejście tego postu https://jira.spring.io/browse/SPR-8263 .
Na podstawie tego postu możesz zwrócić taką wpisaną listę:
źródło
getForEntity
.(Class<? extends ArrayList<User>>) ArrayList.class
Daje również błąd kompilacji „niezgodnych typów”.