Angenommen, ich rufe eine API auf, die mit dem folgenden JSON für ein Produkt antwortet:
{
"id": 123,
"name": "The Best Product",
"brand": {
"id": 234,
"name": "ACME Products"
}
}
Ich kann die Produkt-ID und den Namen mithilfe von Jackson-Anmerkungen gut zuordnen:
public class ProductTest {
private int productId;
private String productName, brandName;
@JsonProperty("id")
public int getProductId() {
return productId;
}
public void setProductId(int productId) {
this.productId = productId;
}
@JsonProperty("name")
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getBrandName() {
return brandName;
}
public void setBrandName(String brandName) {
this.brandName = brandName;
}
}
Verwenden Sie dann die fromJson-Methode, um das Produkt zu erstellen:
JsonNode apiResponse = api.getResponse();
Product product = Json.fromJson(apiResponse, Product.class);
Aber jetzt versuche ich herauszufinden, wie man den Markennamen ergreift, der eine verschachtelte Eigenschaft ist. Ich hatte gehofft, dass so etwas funktionieren würde:
@JsonProperty("brand.name")
public String getBrandName() {
return brandName;
}
Aber natürlich nicht. Gibt es eine einfache Möglichkeit, mithilfe von Anmerkungen das zu erreichen, was ich möchte?
Die eigentliche JSON-Antwort, die ich zu analysieren versuche, ist sehr komplex und ich möchte nicht für jeden Unterknoten eine ganz neue Klasse erstellen müssen, obwohl ich nur ein einziges Feld benötige.
Antworten:
Sie können dies so erreichen:
quelle
this.abbreviation = ((Map<String, Object>)portalCharacteristics.get("icon")).get("ticker").toString();
So habe ich dieses Problem behandelt:
Brand
Klasse:Product
Klasse:Hier wird die
brand
Instanz vonJackson
währendserialization
und ignoriertdeserialization
, da sie mit kommentiert ist@JsonIgnore
.Jackson
verwendet die mit@JsonGetter
forserialization
von Java-Objekt annotierte Methode in dasJSON
Format. AlsobrandName
ist das mit eingestelltbrand.getName()
.In ähnlicher Weise
Jackson
wird die mit@JsonSetter
fordeserialization
ofJSON
formatierte Methode in das Java-Objekt verwendet. In diesem Szenario müssen Sie dasbrand
Objekt selbst instanziieren und seinename
Eigenschaft festlegenbrandName
.Sie können die
@Transient
Persistenzanmerkung mit verwendenbrandName
, wenn Sie möchten, dass sie vom Persistenzanbieter ignoriert wird.quelle
Sie können JsonPath-Ausdrücke verwenden, um verschachtelte Eigenschaften zuzuordnen. Ich glaube, es gibt keine offizielle Unterstützung (siehe dieses Problem), aber hier gibt es eine inoffizielle Implementierung: https://github.com/elasticpath/json-unmarshaller
quelle
Am besten verwenden Sie Setter-Methoden:
JSON:
Die Setter-Methode für lat oder lng sieht folgendermaßen aus:
Wenn Sie beide lesen müssen (wie Sie es normalerweise tun würden), verwenden Sie eine benutzerdefinierte Methode
quelle
Um es einfach zu machen ... Ich habe den Code geschrieben ... das meiste davon ist selbsterklärend.
Main Method
Class ProductTest
Class BrandName
OUTPUT
quelle
Hallo hier ist der komplette Arbeitscode.
// JUNIT TEST CLASS
öffentliche Klasse sof {
//Console.log des Junit-Testfalls
Vollständiger Inhalt: https://gist.github.com/jeorfevre/7c94d4b36a809d4acf2f188f204a8058
quelle