我在我的项目中做了一个反序列化器,但是它没有被调用
我正在使用带有 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)部分
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/