Aber jetzt versuche ich herauszufinden, wie ich an den Markennamen komme, der eine verschachtelte Eigenschaft ist. Ich hatte gehofft, dass so etwas funktioniert:
@JsonProperty("brand.name")
public String getBrandName() {
return brandName;
}
Aber natürlich nicht. Gibt es eine einfache Möglichkeit, mit 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 komplett neue Klasse erstellen müssen, obwohl ich nur ein einziges Feld benötige.
Am Ende habe ich verwendet github.com/json-path/JsonPath — Spring verwendet es auch unter der Haube. Zum Beispiel in ihrem org.springframework.data.web.
@ Robin Würde das nicht funktionieren? this.abbreviation = ((Map<String, Object>)portalCharacteristics.get("icon")).get("ticker").toString();
– Marcello de Sales
31. August 2017 um 6:11 Uhr
Dieselbe Methode kann auch zum Entpacken mehrerer Werte verwendet werden … unpackValuesFromNestedBrand – danke
– msanjay
20. August 2018 um 9:07 Uhr
Verwenden Sie für drei Ebenen direkt JsonNode. Karte wird zu umständlich: void unpackName(JsonNode company) { name = company.get("division").get("brand").get("name).asText(); }
– Michał Grzejszczak
26. Januar 2021 um 11:00 Uhr
@MichałGrzejszczak – Was ist der Wert der JsonProperty-Anmerkung, wenn JsonNode für mehrstufige Zuordnungen verwendet wird?
– Andy Dufresne
8. Februar um 10:03 Uhr
So habe ich dieses Problem gelöst:
Brand Klasse:
package org.answer.entity;
public class Brand {
private Long id;
private String name;
public Brand() {
}
//accessors and mutators
}
Product Klasse:
package org.answer.entity;
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonSetter;
public class Product {
private Long id;
private String name;
@JsonIgnore
private Brand brand;
private String brandName;
public Product(){}
@JsonGetter("brandName")
protected String getBrandName() {
if (brand != null)
brandName = brand.getName();
return brandName;
}
@JsonSetter("brandName")
protected void setBrandName(String brandName) {
if (brandName != null) {
brand = new Brand();
brand.setName(brandName);
}
this.brandName = brandName;
}
//other accessors and mutators
}
Hier die brand Instanz wird von ignoriert Jackson während serialization und deserializationda es mit annotiert ist @JsonIgnore.
Jackson verwendet die mit kommentierte Methode @JsonGetter zum serialization von Java-Objekt in JSON Format. Also, die brandName ist mit eingestellt brand.getName().
Ähnlich, Jackson verwendet die mit kommentierte Methode @JsonSetter zum deserialization von JSON in Java-Objekt formatieren. In diesem Szenario müssen Sie die instanziieren brand Objekt selbst und setze seine name Eigentum aus brandName.
Sie können verwenden @Transient Persistenzanmerkung mit brandNamewenn Sie möchten, dass es vom Persistenzanbieter ignoriert wird.
Sie können JsonPath-Ausdrücke verwenden, um verschachtelte Eigenschaften zuzuordnen. Ich glaube nicht, dass es irgendeine offizielle Unterstützung gibt (siehe Dies Problem), aber hier gibt es eine inoffizielle Implementierung: https://github.com/elasticpath/json-unmarshaller
package com.test;
import com.fasterxml.jackson.annotation.JsonProperty;
public class ProductTest {
private int productId;
private String productName;
private BrandName 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;
}
@JsonProperty("brand")
public BrandName getBrandName() {
return brandName;
}
public void setBrandName(BrandName brandName) {
this.brandName = brandName;
}
@Override
public String toString() {
return "ProductTest [productId=" + productId + ", productName=" + productName + ", brandName=" + brandName
+ "]";
}
}
Class BrandName
package com.test;
public class BrandName {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "BrandName [id=" + id + ", name=" + name + "]";
}
}
OUTPUT
ProductTest [productId=123, productName=The Best Product, brandName=BrandName [id=234, name=ACME Products]]
Das funktioniert, aber ich versuche eine Lösung zu finden, bei der ich nicht für jeden Knoten eine neue Klasse erstellen muss, auch wenn ich nur ein Feld benötige.
– Kenske
3. Mai 2016 um 19:48 Uhr
13119400cookie-checkWie kann man einen verschachtelten Wert mithilfe von Jackson-Anmerkungen einer Eigenschaft zuordnen?yes
Am Ende habe ich verwendet github.com/json-path/JsonPath — Spring verwendet es auch unter der Haube. Zum Beispiel in ihrem org.springframework.data.web.
– Entmenschlicher
6. November 2017 um 22:21 Uhr