2015-10-19 80 views
0

我在我的項目但是這也不會被調用GSON:不打電話給我解串器

我使用改造2.0 GSON取得了解串器,這是一個我的API調用

@GET(UrlConstants.GET_EVENT_COMMENTS) 
    Call<BaseResponseObject<EventCommentsResponseObject<ItemsResponseObject<EventComment>>>> getEventComments 

所以我後端JSON數據總是開始,因爲這

  1. 數據(對象)
  2. 評論(對象)或類似食品的另一個名字,所以我也可能有FoodResp onseObject
  3. 項目(陣列)

3號是另一種對象的數組在這種情況下,其EventComment這是我想要反序列化EventComment解串器的

類聲明什麼

我將只顯示這不是雜亂的帖子,因爲這個問題是一個事實,即解串器不被稱爲

public class CommentDeserializer implements JsonDeserializer<EventComment> { 

註冊到我的單身GSON實例。

gson = new GsonBuilder() 
        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 
        .registerTypeAdapter(EventComment.class, new CommentDeserializer()) 
        .create(); 

響應目標

這裏是什麼反應物體看起來像(如改造API調用聲明所示)

注意我利用這一點避免重複的代碼序列化/反序列化JSON的公用部分

public class BaseResponseObject<T> { 

    @SerializedName("data") 
    private T data; 

-

public class EventCommentsResponseObject<T> { 
    @SerializedName("comments") 
    private T commentsData; 

我不是上述真的很高興,因爲其他數據我要創建另一個類映射JSON

然後終於項目響應對象

public class ItemsResponseObject<T> { 
    @SerializedName("items") 
    private ArrayList<T> mItems; 

這是代表一些數據的JSON數組。在這種情況下,傳入的類型是EventComment。

這裏有一個例子我JSON數據

{ 
    "data": { 
    "comments": { 
     "items": [ 
     { 
      "id": 404, 
      "body": "hi", 
      "updated_at": 1445174795, 
      "self": { 
      "href": "http://test/exmaple/404" 
      } 
     }, 
     { 
      "id": 244, 
      "body": "cool", 
      "updated_at": 1445674795, 
      "self": { 
      "href": "http://test/exmaple/405" 
      }, 

     } 
     ], 

    } 
    } 
} 

我的改造生成器

retrofit = new Retrofit.Builder() 
        .baseUrl(BuildConstants.BASE_URL) 
        .client(okHttpClient) 
        .addConverterFactory(GsonConverterFactory.create(getGson())) 
        .build(); 
+0

是不是因爲一個叫registerTypeAdapter的第一個參數與改進的getEventCommen的返回值之間不匹配ts – Blackbelt

+0

@Blackbelt如果我將其更改爲完整類型,GSON是否不會反序列化公共部分,即數據,註釋,項目。我只想從JSON數組中的每個項目的點反序列化? –

+0

如果您創建一個不使用泛型的新的'BaseResponseObject',該怎麼辦? – rciovati

回答

0

您創建知道你解串器的新GSON,但改裝庫不知道的東西關於你的新Gson對象。 你還是你應該叫setCoverter()創建RestAdapter時:

new RestAdapter.Builder() 
      .setEndpoint(API.ENDPOINT) 
      .setConverter(new GsonConverter(yourgson)) 
      .build() 
      .create(API.class); 
+0

嗨,很抱歉,我忘了提及我已經這樣做了。請檢查我的編輯。注意我使用Retrofit 2.0 –

0

對不起的人,原來的問題是在我的電話(我沒有表現出:() 我每頁和頁面查詢參數已經切換在一起,因此它實際上是讓10頁,其中沒有任何數據,因此解串器不叫。

當我固定它,代碼我張貼工作正常,數據被反序列化。