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:不调用我的反序列化器的主要内容,如果未能解决你的问题,请参考以下文章