java - GSON:不调用我的解串器

标签 java android json gson retrofit

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

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

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

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

  1. 数据(对象)
  2. 评论(对象)或其他名称,如 Foods,所以我可能还有一个 FoodResponseObject
  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();

响应对象

这是响应对象的样子(如 Retrofit API 调用声明中所示)

注意我使用它来避免重复代码来序列化/反序列化 JSON 的公共(public)部分

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

最佳答案

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

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

关于java - GSON:不调用我的解串器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33211991/

相关文章:

java - 如何通过jackson JsonGenerator内联对象?

java - 在java中X时间后调用方法

android - 从属首选项在禁用时显示错误的颜色字体

php - 如何在 iOS 中获取 JSON 响应?获得零值(value)?

java - 在android中以圆周运动移动imageview

java - 将 spring-reactor 集成到现有 Spring Framework 4 STOMP Over WebSocket 应用程序中

android - Facebook SDK : ApiException:The proxied app cannot request publish permissions without having being installed previously

android - 如何处理服务器在我的 android 端关闭时的情况

javascript - 有什么办法可以绕过测试服务器的跨源资源共享?

python - json读取错误json.decoder.JSONDecodeError : Invalid\escape