2016-04-06 5 views
3

Ich benutze Retrofit und JacksonConverter, um JSON-Daten von einer API zu holen.JacksonConverter und ObjectMapper für verschachtelte Objekte

Die JSON Antwort ist wie folgt: -

[ 
    { 
    "id": 163, 
    "name": "Some name", 
    "nested": { 
     "id": 5, 
     "name": "Nested Name", 
     } 
    } 
] 

Aber in meiner Klasse ich will nur die ID, Name des übergeordneten Objekts und den Namen des verschachtelten Objekts

Ich habe diese Klasse: -

@JsonIgnoreProperties(ignoreUnknown = true) 
class A{ 
    @JsonProperty("id") 
    int mId; 

    @JsonProperty("name") 
    String mName; 

    @JsonProperty("nested/name") 
    String mNestedName; 
} 

ich will nicht ein weiteres Objekt für das verschachtelte Objekt in A. erstellen ich möchte nur speichern, das Namensfeld des verschachtelten Objekts in A.

Die obige Klasse wirft keine Ausnahmen, aber der mNestedName ist leer.

Gibt es sowieso eine Möglichkeit, die Daten so zu bekommen? Muss ich die @ JsonProperty für mNestedName ändern.

Dies ist, wie ich meine Retrofit Instanz

ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false); 
     mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

     Retrofit retrofit = new Retrofit.Builder() 
       .addConverterFactory(JacksonConverterFactory.create()) 
       .baseUrl(mBaseUrl) 
       .client(okHttpClient) 
       .build(); 
     return retrofit; 

erklärt haben, und ich bin der Daten durch diese bekommen: -

@GET("something/list/") 
Call<List<A>> getA(@Header("Authorization") String authorization); 
+0

Warum möchten Sie nicht eine andere Klasse für den verschachtelten JSON definieren? das ist die einfachste Lösung hier. – Hector

+0

@Hector Die geschachtelte Klasse hat viele Felder und ich brauche nur ein bestimmtes Feld. Außerdem werde ich Klasse A in der SQLite-Datenbank speichern. Wenn ich also das verschachtelte Objekt verwende, müsste ich das auch in der Datenbank mit Beziehungen zwischen ihnen speichern. Dies würde viel unnötigen Overhead bedeuten. –

Antwort

0

Ich habe keine Erfahrung auf Retrofit haben, aber wenn Ihr Problem ist, meist verwandt mit Jackson. Sie können vermeiden, POJO zu generieren, wenn Sie möchten, indem Sie Ihre A-Klasse mit Setter/Getter umgestalten und den Setter-Parameter in Generic Object ändern.

@JsonIgnoreProperties(ignoreUnknown = true) 
public static class A{ 
    @JsonProperty("id") 
    int mId; 

    @JsonProperty("name") 
    String mName; 


    @JsonIgnoreProperties 
    String mNestedName; 

    public String getmNestedName() { 
     return mNestedName; 
    } 

    @JsonProperty("nested") 
    public void setmNestedName(Object mNestedName) { 
     if(mNestedName instanceof Map) { 
      this.mNestedName = (String)((Map)mNestedName).get("name"); 
     } 
    } 
+0

Danke. Diese Lösung hat für mich funktioniert. –