2016-04-07 24 views
0

Ich habe eine API, die einige wohl nützliche Metadaten zusammen mit angeforderten Daten selbst zurückgibt. Es sieht etwa so aus:Mit GSON nur verschachtelte JSON serialisieren

{ 
"success": true, 
"messages": [], 
/* other metadata */ 
"result": { /* fields with useful data */ } 
} 

Also, im Grunde möchte ich nur Sachen Serialisierung, die innerhalb von Feld „Ergebnis“ verschachtelt ist, vorzugsweise noch mit meta in der Lage zu arbeiten („Erfolg“ auf Wahr/Falsch-Prüfung und Lesen von Nachrichten könnte nützlich sein).

Ich dachte, ich könnte JSONObject zu trennen "Ergebnis" und andere Meta, aber diese Pipeline fühlt sich an wie ein bisschen Overhead. Gibt es eine Möglichkeit, es rein mit GSON zu machen?

Das andere Problem ist, dass ich Retrofit verwenden, die einen sehr sauberen Workflow mit reinem GSON hat. Wenn das oben Genannte der einzig adäquate Weg ist, um mit solch einer API umzugehen, wie sollte ich die Integration in den Retrofit-Workflow angehen?

+0

Ich hatte ein ähnliches Bedürfnis hierfür in der Vergangenheit. Überprüfen Sie die [Antwort auf diese Frage] (http://stackoverflow.com/questions/30114793/adapting-retrofit-responses-using-gson/30157359#30157359). – Ryan

Antwort

0

zu Ihrem Retrofit builder add:

.addConverterFactory(new GsonConverterFactory(new GsonBuilder() 
        .registerTypeAdapter(Result.class, new JsonDeserializer<Result>() { 
         @Override 
         public Result deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
          if(!(((JsonObject) json).getAsJsonPrimitive("success")).getAsBoolean()) { 
           return null; 
          } 
          JsonObject result = ((JsonObject) json).getAsJsonObject("result"); 
          return new Gson().fromJson(result, Result.class); 
         } 
        }).create())) 

gibt es NPE und andere Kontrollen natürlich zu tun :)

0

erstellen POJO mit @Expose Annotation und verwenden Serialisierung = true/false. Wenn Sie nur Erfolg serialisieren möchten, dann würde Ihr POJO in etwa so aussehen.

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class POJO { 
    @SerializedName("success") 
    @Expose(serialize = true, deserialize = false) 
    private Boolean success; 
    ///Your getter/setter methods 
} 

Ich habe das oben mit Retrofit verwendet und es funktioniert gut.

Hoffe, das hilft!

EDIT:

Auch müssen Sie dies erwähnen, während die Retrofit-Service zu schaffen

GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.excludeFieldsWithoutExposeAnnotation(); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(YOUR_BASE_URL) 
      .client(client) 
      .addConverterFactory(GsonConverterFactory.create(gsonBuilder.create())) 
      .build(); 
Verwandte Themen