Ich versuche, dieses JSON-Objekt mit Jackson 2.8 als Teil der Retrofit-Antwort zu deserialisieren. Hier ist die JSON-Antwort, die ich vom Server bekomme.Jackson JSON Array Wert Deserialisierung
{
"id":"8938209912"
"version":"1.1"
"cars":{
"mercedes":[
{
"property":"color"
},
{
"property":"price"
},
{
"property":"location"
}
],
"tesla":[
{
"property":"environment"
}
]
}
}
basierend auf der Abfrage, die cars
oben kann ein oder mehrere Modelle zurückgegeben. Ich kann nicht für jedes Modell eine Klasse erstellen, da diese willkürlich erstellt/entfernt werden. Für jedes Fahrzeugmodell (z. B. tesla
) können ein oder mehrere Schlüssel/Wert-Paare property
vorhanden sein.
Ich bin neu zu Jackson
. Ich habe einige Beispiele betrachtet und sieht aus wie eine benutzerdefinierte @JsonDeserialize
ist der beste Weg zu gehen. So schuf ich Root
Klasse und Cars
Klasse wie folgt:
// In file Root.java
public class Root {
@JsonProperty("id")
private String id = null;
@JsonProperty("version")
private String version = null;
@JsonProperty("cars")
private Cars cars = null;
}
// In file Cars.java
public class Cars {
public Cars(){}
@JsonDeserialize(using = CarDeserializer.class)
private Map<String, List<Property>> properties;
public Map<String, List<Property>> getProperties() {
return properties;
}
public void setProperties(Map<String, List<Property>> properties) {
this.properties = properties;
}
}
// Property.java
public class Property {
@JsonProperty("property")
private String property;
}
Mein Deserialisierer ist unten. Obwohl der leere Konstruktor aufgerufen wird, wird die Parse-Methode selbst überhaupt nicht aufgerufen!
// CarDeserializer.class
public class RelationshipDeserializer extends StdDeserializer<Map<String, List<Action>>>{
protected RelationshipDeserializer(){
super(Class.class);
}
@Override
public Map<String, List<Action>> deserialize(JsonParser parser, DeserializationContext ctx)
throws IOException, JsonProcessingException
{
// This method never gets invoked.
}
}
Meine Fragen:
- Ist das der richtige Ansatz in erster Linie?
- Warum denkst du, die Ausführung wird nie an die
deserialize()
? (I geprüft, diecars
Objekt ist in JSON. - Gibt es bessere Ansätze, um diese JSON parsen mit
Jackson
?
Leider kontrolliere ich nicht die JSON vom Server kommen. – Rettel