【发布时间】:2015-01-28 12:37:38
【问题描述】:
我正在使用 Retrofit(结合 OkHttp 和 GSON)与在线 Web 服务进行通信。 网络服务有一个围绕它的所有响应的默认包装器,类似于:
{
"resultCode":"OK",
"resultObj":"Can be a string or JSON object / array",
"error":"",
"message":""
}
在此示例中,resultCode 将是 OK 或 NO。此外,error 和message 仅在处理请求时发生错误时才具有任何内容。最后但并非最不重要的一点是,resultObj 将包含调用的实际结果(在示例中为字符串,但有些调用返回 JSON 数组或 JSON 对象)。
为了处理这些元数据,我创建了一个通用类,如下所示:
public class ApiResult<T> {
private String error;
private String message;
private String resultCode;
private T resultObj;
// + some getters, setters etcetera
}
我还创建了代表 resultObj 中有时给出的响应的类,并且我定义了一个用于 Retrofit 的接口,看起来有点像这样:
public interface SomeWebService {
@GET("/method/string")
ApiResult<String> someCallThatReturnsAString();
@GET("/method/pojo")
ApiResult<SomeMappedResult> someCallThatReturnsAnObject();
}
只要请求有效,这一切都可以正常工作。但是当服务器端发生错误时,它仍然会返回一个字符串类型的resultObj。这会导致 someCallThatReturnsAnObject 在 Retrofit RestAdapter / GSON 库中崩溃,并显示如下消息:
改造。改造错误: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
预期为 BEGIN_OBJECT,但在第 1 行第 110 列路径 $.resultObj 处为 STRING
现在,最后,我的问题是:
- 是否有一种(简单的)方法可以告诉 GSON,如果它与预期类型不匹配,它应该忽略(也称为“无效”)一个属性?
- 我可以告诉 GSON 将空字符串视为 null 吗?
【问题讨论】:
标签: java android json gson retrofit