当我使用Retrofit时,我已经设计了所有POJO,并且它运行完美。 API的设计方式是,如果数据是当前日期或未来日期而不是过去日期,它将发送所需数据。在响应中,我将获得一个JSON响应,其中包含JSON对象和数组的组合作为JSON对象的值,POJO就是根据这一点。现在,如果没有当前和未来日期的记录,那么我将收到一个字符串而不是一个数组,这会导致API错误java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING
。所以我想知道是否有任何我可以确定的方式 - 我接收的数组或字符串是什么?以及如何根据这一点更新POJO以避免该错误。
服务器没有数据时的JSON响应
{
"Result_Code": "ND",
"Result_Status": "Success",
"Result_Message": "No record found in database.",
"Result_Output": "",
"updatedDate": "20-07-2017 10:44:37"
}
当服务器有数据但有一点差异时,JOSN响应相同
{
"Result_Code": "ND",
"Result_Status": "Success",
"Result_Message": "record found in database.",
"Result_Output": [{multiple elements},
{multiple elements},
{multiple elements}....],
"updatedDate": "20-07-2017 10:44:37"
}
答案 0 :(得分:6)
名为ResponseModel
public class ResponseModel {
private String Result_Code;
private String Result_Status;
private String Result_Message;
private Object Result_Output;
private String updatedDate;
...
}
使用Object
您可以变形如下
call.enqueue(new Callback<ResponseModel>()
{
@Override
public void onResponse(Response<ResponseModel> response, Retrofit retrofit)
{
parseData(); // get other data from ResponseModel Class
if (response.getResultOutput() instanceof List<POJO>)
{
doSomething();
}
else if (response.getResultOutput() instanceof String)
{
doSomething();
}
else //must be error object
{
doSomething();
}
}
@Override
public void onFailure(Throwable t)
{
///Handle failure
}
});
使用instanceof
检查所需的Object
类型
List<POJO>
用于多个元素Model
的位置
*检查更新的解决方案,以便从响应对象中解析ArrayList
希望它可能是你想要的工作
答案 1 :(得分:2)
在调试模式下捕获你的json并使用下面的链接生成pojo类。然后比较你的班级,看看差异
http://www.jsonschema2pojo.org/ 你可以尝试这种方法。
try {
callArrayPojo();
} catch (IllegalStateException e) {
callStringPojo();
} catch (Exception e) {
//other}
或者您可以获得ResultMessage泛型类型
...
private String Result_Code;
private String Result_Status;
private T Result_Message;
...