2015-10-19 81 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页,其中没有任何数据,因此解串器不叫。

当我固定它,代码我张贴工作正常,数据被反序列化。