Ich habe zwei Fragen:
- So ordnen Sie eine Liste von JSON-Objekten mit Spring RestTemplate zu.
- So ordnen Sie verschachtelte JSON-Objekte zu
Ich versuche, https://bitpay.com/api/rates zu konsumieren , indem ich dem Tutorial von http://spring.io/guides/gs/consuming-rest/ folge .
java
spring
resttemplate
Karudi
quelle
quelle
Antworten:
Vielleicht so ...
Controller-Code für die
RequestMapping
ResponseEntity
ist eine ErweiterungHttpEntity
, die einenHttpStatus
Statuscode hinzufügt . Verwendet inRestTemplate
als auch@Controller
Methoden. InRestTemplate
dieser Klasse wird vongetForEntity()
und zurückgegebenexchange()
.quelle
Definieren Sie zuerst ein Objekt, das die Entität enthält, die im Array zurückkommt. ZB
Dann können Sie den Dienst nutzen und eine stark typisierte Liste erhalten über:
Die anderen oben genannten Lösungen funktionieren ebenfalls, aber ich möchte eine stark typisierte Liste anstelle eines Objekts [] zurückerhalten.
quelle
restTemplate.exchange
Marshalls werden alle JSON-Werte den übereinstimmenden Schlüsselnamen als Eigenschaften im Rate-Objekt zugeordnet. Hoffe mein Denkprozess ist richtig.Bei mir hat das geklappt
Wobei Objekt die gewünschte Klasse ist
quelle
Coupon[] coupons = restTemplate.getForObject( url, Coupon[].class)
[]
aber vollständig leer). Seien Sie also vorsichtig und suchen Sie nachnull
(if (forNow != null)...
).Object.class
in der Methode angegebengetForObject()
.Nach mehreren Tests ist dies der beste Weg, den ich gefunden habe :)
Alles was Sie dort brauchen
quelle
Mein großes Problem dabei war, die Objektstruktur zu erstellen, die erforderlich ist, um RestTemplate einer kompatiblen Klasse zuzuordnen. Zum Glück habe ich http://www.jsonschema2pojo.org/ gefunden (erhalte die JSON-Antwort in einem Browser und verwende sie als Eingabe) und kann dies nicht genug empfehlen!
quelle
Ich habe tatsächlich etwas Funktionales für eines meiner Projekte entwickelt und hier ist der Code:
Ich hoffe, dass dies jemandem helfen wird!
quelle
Wenn Sie eine Liste von Objekten bevorzugen, können Sie dies folgendermaßen tun:
Und benutze es so:
Erklärungen zu den oben genannten Themen finden Sie hier ( https://www.baeldung.com/spring-rest-template-list ) und werden im Folgenden umschrieben.
"Im obigen Code passieren einige Dinge. Erstens verwenden wir ResponseEntity als Rückgabetyp, um die Liste der Objekte zu umbrechen, die wir wirklich wollen. Zweitens rufen wir RestTemplate.exchange () anstelle von getForObject () auf. .
Dies ist die allgemeinste Methode zur Verwendung von RestTemplate. Dazu müssen wir die HTTP-Methode, den optionalen Anforderungshauptteil und einen Antworttyp angeben. In diesem Fall verwenden wir eine anonyme Unterklasse von ParameterizedTypeReference für den Antworttyp.
Dieser letzte Teil ermöglicht es uns, die JSON-Antwort in eine Liste von Objekten des entsprechenden Typs zu konvertieren. Wenn wir eine anonyme Unterklasse von ParameterizedTypeReference erstellen, werden mithilfe der Reflektion Informationen zum Klassentyp erfasst, in den unsere Antwort konvertiert werden soll.
Diese Informationen werden mithilfe des Type-Objekts von Java beibehalten, und wir müssen uns nicht mehr um das Löschen von Typen kümmern. "
quelle
Sehen Sie sich diese Antwort an, insbesondere wenn Sie Generika in Spring RestTemplate und generische Typen verwenden möchten.
List
ParameterizedTypeReference-Sammlungen wie List <T>quelle
Sie können POJO für jeden Eintrag erstellen, wie z.
Verwenden Sie dann ParameterizedTypeReference der Liste von BitPay, um Folgendes zu verwenden:
quelle
Ich habe in diesem Beitrag https://jira.spring.io/browse/SPR-8263 Arbeit gefunden .
Basierend auf diesem Beitrag können Sie eine typisierte Liste wie folgt zurückgeben:
quelle
getForEntity
. Auch(Class<? extends ArrayList<User>>) ArrayList.class
gibt einen „inkompatible Typen“ Compiler - Fehler.