Dynamic 改装2:如何处理动态响应

Dynamic 改装2:如何处理动态响应,dynamic,retrofit2,pojo,Dynamic,Retrofit2,Pojo,我正在尝试从此api获取数据: 我正在使用改型2,并为第一个json创建了一个pojo。我好奇的是,当数据不可用时,如何将我的pojo转换为第二个pojo 当有可用数据时,它返回以下json: 当没有数据可用时,它返回以下json: 你有两个选择。在我看来,最简单的方法是在原始pojo中包含错误字段,并始终检查字段响应。当这是“True”时,所有其他字段都将出现。当“False”时,只有错误字段会出现 另一个选择,也许是最不灵活、最不容易理解的选择,就是从可以继承的位置创建一个pojo错误。

我正在尝试从此api获取数据: 我正在使用改型2,并为第一个json创建了一个pojo。我好奇的是,当数据不可用时,如何将我的pojo转换为第二个pojo

当有可用数据时,它返回以下json:

当没有数据可用时,它返回以下json:


你有两个选择。在我看来,最简单的方法是在原始pojo中包含
错误
字段,并始终检查字段
响应
。当这是“True”时,所有其他字段都将出现。当“False”时,只有
错误
字段会出现

另一个选择,也许是最不灵活、最不容易理解的选择,就是从可以继承的位置创建一个pojo
错误。您仍然需要检查
Response
的值,以检查是否存在错误。我个人会在这里避免这个选择,但我认为知道你仍然可以这样做是件好事。大概是这样的:

class Error {
  @SerializedName("Error")
  @Expose
  private String error;
  // ...
}

class Movie extends Error {
  // other fields here
}
正如你所看到的,这是相当丑陋的,但工作

您可以尝试的第三个选项是检查Http状态代码。这取决于API。如果api在出现错误时返回Http代码200,那么这就不是那么简单了。然而,它是我的最爱,因为它在我看来提供了更多的正确性

假设api在没有数据时返回HTTP404。然后,您可以检查此状态并使用不同的pojo来反序列化错误主体(pojo可能只是错误消息)。如果您正在对内置的
回调进行改装
,则必须在
onResponse
上执行此操作。如果您使用的是
RxJava
,那么这就更直接了,因为您可以在
onError
方法中轻松实现(所有非2XX http响应都位于
onError
方法中)

您可以使用访问改装响应的错误正文。您可以使用
Gson
或仅使用以下代码段将其转换为pojo:

Converter<ResponseBody, MyError> converter = new GsonConverterFactory()
   .responseBodyConverter(MyError.class, Annotation[0]);
MyError error = converter.convert(response.errorBody());
Converter Converter=new GsonConverterFactory()
.responseBodyConverter(MyError.class,注释[0]);
MyError error=converter.convert(response.errorBody());
(此处
MyError
是包含错误字段的pojo的名称)

您可能只想创建一次转换器工厂。最有可能的是您在创建
改型
实例时使用的


如果您实际使用的是
RxJava
,您可以查看我关于如何在接收响应中访问错误体的答案

非常感谢您提供的详细答案,Fred.=)我选择了第二种选择。我创建了一个包含响应和错误字段的状态模型,然后用状态扩展了我的第一个模型
class Error {
  @SerializedName("Error")
  @Expose
  private String error;
  // ...
}

class Movie extends Error {
  // other fields here
}
Converter<ResponseBody, MyError> converter = new GsonConverterFactory()
   .responseBodyConverter(MyError.class, Annotation[0]);
MyError error = converter.convert(response.errorBody());