我正在尝试从此API获取数据:http://www.omdbapi.com/ 我正在使用Retrofit 2并为第一个json创建了一个pojo。我很好奇的是当数据不可用时如何将我的pojo转换为第二个。
当有可用数据时,它返回此json:
http://www.omdbapi.com/?t=Suits
{
Response: "False",
Error: "Movie not found!"
}
当没有数据可用时,它返回此json:
http://www.omdbapi.com/?t=asdasdas
while (Input.hasNext()){
String in = Input.next();
for(int i=0;i< in.length();i++) {
if(Character.toLowerCase(in.charAt(i)) == 'f')
System.out.print(f+",");
else if(Character.toLowerCase(in.charAt(i))=='e')
System.out.print(e+",");
}
System.out.println("");
}
答案 0 :(得分:3)
你有几个选择。在我的脑海中,最简单的一个是在原始的pojo中包含Error
字段,并始终检查字段Response
。当这是&#34; True&#34;比所有其他领域都要存在。当&#34; False&#34;时,只有Error
字段。
另一种选择,也许最不灵活和可理解的是从你可以继承的地方获得一个pojo Error
。您仍然需要检查Response
的值以检查是否存在错误。我个人会在这里避免这个选项,但我认为你仍然可以做到这一点很好。像这样:
class Error {
@SerializedName("Error")
@Expose
private String error;
// ...
}
class Movie extends Error {
// other fields here
}
正如你所看到的那样,这很难看,但有效......
您可以尝试的第三个选项是检查Http状态代码。这个取决于API。如果api返回Http代码200,即使出现错误,那么这不是那么直接。然而,它是我最喜欢的,因为它提供了更多正确性。
假设api在没有数据的情况下返回Http 404。然后,您可以检查此状态并使用不同的pojo来反序列化错误正文(pojo可能只是错误消息)。如果您使用内置Callbacks
进行改造,则必须在onResponse
上执行此操作。如果您正在使用RxJava
,那么这更加直接,因为您可以在onError
方法中轻松完成(所有非2XX http响应都在onError
方法中着陆)。
您可以使用errorBody访问改装响应的错误正文。您可以使用Gson
或仅使用此代码段将其转换为pojo:
Converter<ResponseBody, MyError> converter = new GsonConverterFactory()
.responseBodyConverter(MyError.class, Annotation[0]);
MyError error = converter.convert(response.errorBody());
(这里MyError
将是包含错误字段的pojo的名称。)
您可能只想创建转换器工厂一次。最有可能应该是您在创建Retrofit
实例时使用的那个。
如果您实际使用RxJava
,可以查看我的答案here,了解如何在Rx响应中访问错误正文