2015-12-18 82 views
0

我的服務器響應是不同類型JSON對象的列表,這取決於每個響應的「類型」。每種響應類型都有不同的bean。可以使用適當的Bean類對列表中的每個響應(JSON對象)使用適當的Bean類(JSON數組)嗎?使用Retrofit2處理JSON數組中的多個JSON對象類型

{ 
    "cards": [2] 
     0: { 
      "type": "A" 
      "ID": 24 
      "author_name": "ari" 
      "title": "BB" 
      "permalink": "" 
      "created_date": "2015-12-18 17:17:00" 
      "post_date": "Dec 18 2015" 
      "thumbnail": "" 
      "summary": "Stars" 
      "thumbSmall": "100.jpg" 
      "androidXL": "500.jpg" 
     }- 
     1: { 
      "type": "B" 
      "_id": "3290" 
      "read_count": 0 
      "categories": [1] 
       0: "abc"  
      "title": "New" 
      "isSticky": false 
      "section": [0] 
      "author": "zzz" 
      "india": false 
      "update_time": 1450415789694 
      "summary": "Social" 
      "scoreId": "nz" 
      "isActive": true 
      "image": "" 
      "timestamp": 1450385165210 
      "events": [1] 
       0: "nz" 
      "teams": [0] 
      "slug": "new" 
      "isDeleted": false 
      "score_str": "SL" 
     } 
    } 

作爲一種變通方法,我創建了一個新的Bean類,與所有可能的領域,幾乎一半的字段都是空的每個JSON對象。
有沒有更好的方法來做到這一點?

回答

1

您可以創建一個包含常見的所有類型的數據的超類和擴展它:

public abstract class SuperItem { 

public enum Type { 
    @SerializedName("A") 
    TYPEA(1), 

    @SerializedName("B") 
    TYPEB(2); 

    Type(final int value) { 
     this.value = value; 
    } 

public static Type fromInteger(int i) { 
     switch (i) { 
      case 1: 
       return TYPEA; 
      case 2: 
       return TYPEB; 
      default: 
       Log.d("SuperItem", "No existing type for integer: " + i); 
       return null; 
     } 
    } 
} 

} 

@SerializedName("type") private Type type; 
} 

public class AItem extends SuperItem { 

} 
public class BItem extends SuperItem { 

} 

改造默認情況下依靠GSON的JSON反序列化。您需要創建自定義GSON解串器爲您實現,它設置爲您RestAdapter:

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(SuperItem.class, new SuperItemDeserializer()); 
Gson gson = builder.build(); 
Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .build(); 

您的自定義解串器可以是這樣的:

public class SuperItemDeserializer implements  JsonDeserializer<SuperItem> { 

@Override 
public SuperItem deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
    Gson gson = new Gson(); 
    SuperItem item = null; 
    JsonObject rootObject = json.getAsJsonObject(); 
    int typeInt = rootObject.get("type").getAsInt(); 
    SuperItem.Type type = SuperItem.Type.fromInteger(typeInt); 
    switch (type) { 
     case TYPEA: 
      item = gson.fromJson(json, AItem.class); 
      break; 
     case TYPEB: 
      item = gson.fromJson(json, BItem.class); 
      break; 
     default: 
      Log.d("TAG", "Invalid type: " + typeInt); 
    } 
    return item; 
} 
} 

希望在本例中的命名是不是太糟糕你會明白:)