2017-03-28 32 views
0

解決JSON字段類型我有以下API響應:動態使用GSON

{ 
    "data":{ 
     "categoryFields":[ 
     { 
      "name":"brand", 
      "label":"Marca", 
      "values":[ 
       { 
        "key":53, 
        "value":"Alfa Romeo" 
       }, 
       { 
        "key":55, 
        "value":"Audi" 
       } 
      ] 
     }, 
     { 
      "name":"year", 
      "label":"Año", , 
      "dataType":"select", 
      "values":[ 
       { 
        "key":2017, 
        "value":2017 
       }, 
       { 
        "key":2016, 
        "value":2016 
       } 
      ] 
     }, 

     ] 
    } 
} 

確定,在所述第一categoryField的值是:

"key":53 INT, 
"value":"Alfa Romeo", STRING 

在第二categoryField的值是:

"key":2017, INT 
"value":2017, INT 

另外還有另一種類型:

"key":"string", STRING 
"value":"String", STRING 

我需要一個可以處理這些類型數據的類。例如:

public class Value { 

    @SerializedName("key") 
    @Expose 
    private DYNAMIC_TYPE key; 

    @SerializedName("value") 
    @Expose 
    private DYNAMIC_TYPE value; 

} 

我該怎麼做?或者有一個Gson函數來幫助我呢?

回答

0

解決方案

public class CategoryValueDeserializer implements JsonDeserializer<CategoryValue> { 
    @Override 
    public CategoryValue deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 

     final JsonObject jsonObject = json.getAsJsonObject(); 

     final JsonElement jsonKey = jsonObject.get("key"); 
     final String key = jsonKey.getAsString(); 

     final JsonElement jsonValue = jsonObject.get("value"); 
     final String value = jsonValue.getAsString(); 

     CategoryValue categoryValue = new CategoryValue(); 
     categoryValue.setKey(key); 
     categoryValue.setValue(value); 

     return categoryValue; 

    } 
} 

// retrofit

final Gson gson = new GsonBuilder() 
       .registerTypeAdapter(Response.class, new CategoryValueDeserializer()) 
       .create(); 

     Retrofit.Builder builder = new Retrofit.Builder() 
       .baseUrl(END_POINT) 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create());