GSON:不调用我的反序列化器

Posted

技术标签:

【中文标题】GSON:不调用我的反序列化器【英文标题】:GSON: Not calling my Deserializer 【发布时间】:2016-01-17 15:46:02 【问题描述】:

我在我的项目中制作了一个反序列化器,但是它没有被调用

我正在使用带有 GSON 的 Retrofit 2.0,这是我的 API 调用之一

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

所以我的后端 JSON 数据总是这样开始

    数据(对象) 评论(对象)或其他名称,例如 Foods,因此我可能还有一个 FoodResponseObject 项目(数组)

数字 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();

响应对象

这是响应对象的样子(如 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();

【问题讨论】:

因为 registerTypeAdapter 的第一个参数和你的改造 getEventComments 的返回值不匹配而没有调用它 @Blackbelt 如果我将其更改为完整类型,GSON 将不再反序列化公共部分,即数据、cmets、项目。我只想从 JSON 数组中每个项目的点反序列化? 如果您创建一个不使用泛型的新 BaseResponseObject 怎么办? 你可以试一试并调试反序列化器将解析的内容 【参考方案1】:

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

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

【讨论】:

嗨,很抱歉,我忘了说我已经这样做了。请检查我的编辑。注意我使用 Retrofit 2.0【参考方案2】:

抱歉,问题出在我的电话中(我没有显示 :( ) 我已经将每页和页面查询参数切换在一起,所以它实际上得到了没有数据的第 10 页,因此没有调用反序列化器。

当我修复它时,我发布的代码运行良好,并且数据被反序列化。

【讨论】:

以上是关于GSON:不调用我的反序列化器的主要内容,如果未能解决你的问题,请参考以下文章

在Gson反序列化期间使用Dagger进行依赖注入

jackson实现序列化的反序列化解析

.net 3.5 中的反序列化对象

Jackson序列化(8)— 支持泛型的反序列化

完全理解Gson:Gson序列化

枚举的反序列化不起作用 - Jackson [重复]