Wie wird ein verschachtelter Wert mithilfe von Jackson-Annotationen einer Eigenschaft zugeordnet?
Sagen wir, ich mache einen Aufruf einer API, reagiert mit dem folgenden JSON-für ein Produkt:
{
"id": 123,
"name": "The Best Product",
"brand": {
"id": 234,
"name": "ACME Products"
}
}
Ich bin in der Lage, zum anzeigen der Produkt-id und den Namen nur gut mit Jackson Anmerkungen:
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;
}
}
Werden und anschließend über die Methode fromJson zu erstellen das Produkt:
JsonNode apiResponse = api.getResponse();
Product product = Json.fromJson(apiResponse, Product.class);
Aber jetzt bin ich versucht, herauszufinden, wie zu packen, die Marke, die eine nested-Eigenschaft. Ich hatte gehofft, dass sowas funktionieren würde:
@JsonProperty("brand.name")
public String getBrandName() {
return brandName;
}
Aber natürlich Tat es das nicht. Gibt es einen einfachen Weg das zu erreichen, was ich will, mit Anmerkungen?
Den eigentlichen JSON-Antwort, die ich bin versucht zu analysieren, ist sehr Komplex, und ich will nicht zu haben, um eine ganze neue Klasse für jeden sub-Knoten, obwohl ich nur ein einziges Feld.
InformationsquelleAutor der Frage kenske | 2016-05-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erreichen dies so:
InformationsquelleAutor der Antwort Jacek Grobelny
Können Sie JsonPath-Ausdrücke, die die Karte verschachtelte Eigenschaften. Ich glaube nicht, dass es keine offizielle Unterstützung (siehe diese Problem), aber es gibt eine inoffizielle Umsetzung hier: https://github.com/elasticpath/json-unmarshaller
InformationsquelleAutor der Antwort gogstad
Machen es einfach ..ich habe geschrieben, der code ...das meiste ist selbsterklärend.
Main Method
Class ProductTest
Class BrandName
OUTPUT
InformationsquelleAutor der Antwort Srikanth Lankapalli
Dies ist, wie ich behandelt dieses problem:
Brand
Klasse:Product
Klasse:Hier, die
brand
Instanz ignoriertJackson
währendserialization
unddeserialization
denn es ist versehen mit@JsonIgnore
.Jackson
wird mit der Methode annotiert mit@JsonGetter
fürserialization
java-Objekt inJSON
- format. So, diebrandName
mitbrand.getName()
.Ebenso
Jackson
wird mit der Methode annotiert mit@JsonSetter
fürdeserialization
vonJSON
- format in java-Objekt. In diesem Szenario müssen Sie instanziieren diebrand
Objekt selbst und seinename
Eigenschaft vonbrandName
.Können Sie
@Transient
Persistenz annotation mitbrandName
wenn Sie es wollen, zu sein ignoriert durch persistence provider.InformationsquelleAutor der Antwort Sunny KC
Hallo hier ist die kompletten funktionierenden code.
//JUNIT-TEST-KLASSE
public class s O f {
//Console.Logbuch der junit-testcase
Komplette Kern : https://gist.github.com/jeorfevre/7c94d4b36a809d4acf2f188f204a8058
InformationsquelleAutor der Antwort jeorfevre