【发布时间】:2015-07-18 20:04:12
【问题描述】:
我希望通过从特定 API 收到的每个成功响应来检索已知 JSON 对象的子元素。
每个服务器响应都返回以下 JSON 格式(为简单起见进行了精简):
{
"status": "success",
"error_title": "",
"error_message": "",
"data": {
"messages": [
{ "message_id": "123",
"content": "This is a message" },
{ "message_id": "124",
"content": "This is another message" }
]
}
}
错误响应包含相同的通用格式,“数据”对象为空,错误相关的 JSON 对象包含有用的值。在出现错误的情况下,我想提取与错误相关的 JSON 对象。
通过上述响应,我有一个 MessageResponse 类,其中包含状态、errorTitle 和 errorMessage 字符串属性以及一个 MessageData 对象。然后MessageData 对象包含一个消息列表 - List<Message> messages。我在这种情况下获取消息的 GET 方法如下(为简单起见):
@GET("/chat/conversation")
void getMessages(Callback<MessageResponse> callback);
如果我坚持使用 GSON 的序列化程序提供的开箱即用的默认 POJO 映射,则此设计需要三个类用于 每个 响应类型。我的最终目标是通过仅从成功的服务器响应中读取我需要的内容并忽略其余部分来减少所需的类数量。我希望此 API 上的所有成功回调数据类型尽可能接近“数据”内容。
换句话说,我想不可知地返回“数据”的子元素。在上面的例子中,它是一个名为“messages”的数组,但在其他一些响应中,它可能是一个“用户”对象,例如。我知道这可以通过为每种响应类型注册单独的 TypeAdapters 来完成,但我想通过使用单一的通用解决方案来实现我的最终目标。
更新:从下面执行大卫的建议
public class BaseResponse<T> {
@SerializedName("status") public String status;
@SerializedName("error_title") public String errorMessageTitle;
@SerializedName("error_message") public String errorMessage;
@SerializedName("data") public T data;
}
public class MessagesResponse extends BaseResponseData<List<Message>> {
@SerializedName("messages") List<Message> messages;
}
@GET("/chat/conversation")
void getMessages(Callback<BaseResponse<MessageResponse>> callback);
不幸的是,这没有得到正确的序列化。如果我能以某种方式通知 GSON 来自“数据”父级的可变名称 JSON 对象子级,并将该子级反序列化为由通用数据类型引用的模型类。本质上,dataJsonObject.getChild()。
【问题讨论】:
-
所以你有一个固定的 JSON 结构,但
data可能是任何东西?或者只是许多预定义类型中的任何一种?如果后者是真的,我使用了一个通用的BaseResponse<T>,其中data的类型是T。然后,例如,一个UserResponse extends BaseResponse<User>只需要实现一个构造函数并从BaseResponse继承所有其他内容。 -
@david.mihola 感谢您的好主意。我尝试将我的模型设置与您提出的设计相匹配,但我收到了一个空的帖子列表。有关我的修改,请参见上文。您能否提供示例代码来说明您的解决方案?
-
我刚刚发布了我们项目中的示例类!
标签: android json gson retrofit