Java 将null反序列化为gson中的特定对象

Java 将null反序列化为gson中的特定对象,java,android,gson,retrofit,rx-java,Java,Android,Gson,Retrofit,Rx Java,我有一个旧的awebservice类实现,它是在Reformation1和rxjava1的基础上工作的,使用起来很麻烦,所以我从头开始编写了一个新的awebservice类 对API请求的每个响应都包含以下对象 { "status":200, "payload": {} } 我绕过了信封问题,只需将每个响应包装到一个通用对象中,当访问有效负载时,我可以通过调用getter轻松做到这一点 class BaseResponse<T> { int status; T p

我有一个旧的awebservice类实现,它是在Reformation1和rxjava1的基础上工作的,使用起来很麻烦,所以我从头开始编写了一个新的awebservice类

对API请求的每个响应都包含以下对象

{
  "status":200,
  "payload": {}
}
我绕过了信封问题,只需将每个响应包装到一个通用对象中,当访问有效负载时,我可以通过调用getter轻松做到这一点

class BaseResponse<T> {

  int status;
  T payload;

  public T getPayload(){
    return payload;
  }

}
现在我遇到了一个问题。有一些API请求,其中responsebody定义为空。我将这些空响应定义为
class EmptyResponse{}

问题是我得到了这样的空身体

{
  "status":200,
  "payload":null
}
现在的问题是,
payload
为null,并且rxjava2不需要null值



有没有办法让GSON将
null
反序列化为
EmptyResponse
类型的对象?请注意,这仅适用于记录为返回空响应的调用。如果调用有记录的主体,则调用不可能返回空响应。只需在map()中检查null并返回EmptyResponse对象,该对象丑陋且容易出错,因为我需要记住为返回EmptyResponse的调用添加该对象。最后,我想在改装接口上编写一个annotationprocessor,自动为我生成所有调用(因为我们的应用程序中已经有约70个网络调用),如果我不必首先关心空值,这将是最简单的,因为你的
BaseResponse
是某种已知的t类型,在您的示例中,假设T是
SomeResponse
,您有一个类型为
SomeResponse
的方法
getPayload
,当其他对象的值为null时,GSON就无法将其打开。因此,您需要一些后处理来将这个空值提取到某个值。至于丑陋和容易出错,我会提出不同的观点,您可以使用改型调用适配器或您的注释处理组合它并封装这个逻辑。
{
  "status":200,
  "payload":null
}