GSON:没有打电话给我的Deserializer

时间:2015-10-19 10:22:35

标签: java android json gson retrofit

我在我的项目中创建了一个Deserializer,但是它没有被称为

我正在使用GSON的Retrofit 2.0,这是我的API调用

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

所以我的后端JSON数据总是以这个

开头
  1. 数据(对象)
  2. 评论(对象)或其他名称,如食物,所以我可能还有一个FoodResponseObject
  3. 项目(数组)
  4. Number 3是另一种对象的数组,在这种情况下是它的EventComment,这是我想要反序列化的

    EventComment deserialiser的类声明

    我只会证明这不会使帖子混乱,因为问题在于没有被称为反序列化器

    public class CommentDeserializer implements JsonDeserializer<EventComment> {
    

    在我的单件GSON实例上注册它。

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

    响应对象

    以下是响应对象的外观(如Retrofit 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();
    

2 个答案:

答案 0 :(得分:0)

你创建了一个知道你的反序列化器的新gson,但是改造库并不知道你的新Gson对象。 所以你应该在创建RestAdapter时调用setCoverter():

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

答案 1 :(得分:0)

对不起的人,事实证明问题出在我的电话中(我没有显示:() 我已经将每页和页面查询参数一起切换,因此它实际上获得了没有数据的第10页,因此没有调用反序列化程序。

当我修复它时,我发布的代码工作正常,数据被反序列化。