2017-03-10 3 views
0

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:

  1. Ist das der richtige Ansatz in erster Linie?
  2. Warum denkst du, die Ausführung wird nie an die deserialize()? (I geprüft, die cars Objekt ist in JSON.
  3. Gibt es bessere Ansätze, um diese JSON parsen mit Jackson?

Antwort

0

Die „Eigenschaften“ Deserializer heißt nie, weil das nichts in diesem JSON entspricht. Der Feldname in der JSON ist "Eigenschaft" und es entspricht nicht Map<String, List<Property>>. Es sieht so aus, als wäre es näher List<Property>

Kontrollieren Sie die in kommenden JSON? Es wäre besser für den Namen/Typ des Autos zu sein in einem eigenen Feld statt dem Namen des Objekts. Dann können Sie ein generisches Objekt verwenden. Was Sie jetzt haben, wird brechen Mal fügen sie einen neuen Namen/Typ hinzu und Sie haben kein passendes Objekt dafür.

+0

Leider kontrolliere ich nicht die JSON vom Server kommen. – Rettel

Verwandte Themen