我在我的项目中创建了一个Deserializer,但是它没有被称为
我正在使用GSON的Retrofit 2.0,这是我的API调用
@GET(UrlConstants.GET_EVENT_COMMENTS)
Call<BaseResponseObject<EventCommentsResponseObject<ItemsResponseObject<EventComment>>>> getEventComments
所以我的后端JSON数据总是以这个
开头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();
答案 0 :(得分:0)
你创建了一个知道你的反序列化器的新gson,但是改造库并不知道你的新Gson对象。 所以你应该在创建RestAdapter时调用setCoverter():
new RestAdapter.Builder()
.setEndpoint(API.ENDPOINT)
.setConverter(new GsonConverter(yourgson))
.build()
.create(API.class);
答案 1 :(得分:0)
对不起的人,事实证明问题出在我的电话中(我没有显示:() 我已经将每页和页面查询参数一起切换,因此它实际上获得了没有数据的第10页,因此没有调用反序列化程序。
当我修复它时,我发布的代码工作正常,数据被反序列化。