我做了一个功能:输入身份证号码,点击提交按钮,然后获得身份证的基本信息。
我使用的模型是:
public class IdCardInfo {
private int errNum;
private String retMsg;
private RetDataBean retData;
public int getErrNum() {
return errNum;
}
public void setErrNum(int errNum) {
this.errNum = errNum;
}
public String getRetMsg() {
return retMsg;
}
public void setRetMsg(String retMsg) {
this.retMsg = retMsg;
}
public RetDataBean getRetData() {
return retData;
}
public void setRetData(RetDataBean retData) {
this.retData = retData;
}
public static class RetDataBean {
private String sex;
private String birthday;
private String address;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
}
我使用的改装界面:
@GET("apistore/idservice/id")
Observable<IdCardInfo> getIdCardInfo(@Query("id") String id);
当我输入正确的身份证号码时,一切正常。返回的结果是:
{
"errNum": 0,
"retMsg": "success",
"retData": {
"sex": "M",
"birthday": "1987-04-20",
"address": "some place"
}
}
一切运作良好。
然而,当我输入不正确的身份证号码时,不好的事情发生了:
Caused by: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 86 path $.retData
返回的结果是:
{
"errNum": -1,
"retMsg": "Incorrect ID card number!",
"retData": [ ]
}
我怎样才能修复这些漏洞?
返回数组时应使用响应列表,例如:
@GET("apistore/idservice/id")
Observable<List<IdCardInfo>> getIdCardInfo(@Query("id") String id);
代替
@GET("apistore/idservice/id")
Observable<IdCardInfo> getIdCardInfo(@Query("id") String id);
也在你的改装电话中替换
Call<List<IdCardInfo>> call = service.getIdCardInfo("query");
call.enqueue(new Callback<List<IdCardInfo>>() {
@Override
public void onResponse(Call<List<IdCardInfo>> variant, Response<List<IdCardInfo>> response) {
if (response != null && response.isSuccessful() && response.errorBody() == null) {
}
}
@Override
public void onFailure(Call<List<IdCardInfo>> variant, Throwable t) {
t.printStackTrace();
}
});
这是服务器的问题,在没有数据的情况下,它返回空数组,您的服务器API最有可能基于一些PHP框架。
它只能从后端排序,不能从应用程序排序,因为如果不更改类结构,就无法解析数组而不是对象。
所以问你的后端团队是否有可能改变这件事。空数组为空对象或没有键应该被发送。
在这种情况下可能发生的黑客行为:
是的,我知道确切的问题,它不能轻易改变,因为它是在框架级别。我建议你可以像这样修改代码
@GET("apistore/idservice/id")
Observable<JsonObject> getIdCardInfo(@Query("id") String id);
所以在此之后,您需要手动解析代码,然后需要将特定的密钥解析放在try-catch块中。例如,在try块中,如果面临异常,您将尝试将数据解析为对象,然后只为该对象值分配null。
api@apistore/idservice/id返回的是一个空的json数组,而不是一个空的json对象。这里需要一个json对象,所以它会抛出。你能控制API返回的内容吗?请回
{
"errNum": -1,
"retMsg": "Incorrect ID card number!",
"retData": { }
}
在回应中。
我每次都会收到这个错误:预期的begin_数组,但它是begin_对象。我不知道我是否需要添加反序列化程序或warrper类来进行改造,但我不知道如何以简单的方式来满足我所有项目的api json响应,下面是我的改造代码: - 我的Json: 我的源代码
我不熟悉GSON和改装,这是我的输出模型(仅供参考结构), 这是我的输出 这是我的改装代码 应为BEGIN_对象,但为BEGIN_数组“ 我尝试过用List替换RootObject
我正在通过改型和RXAndroid与来自android的REST API进行交互,我遇到了一个问题。 当我向我的“api/users/{id}/{id}/classes”发送GET请求时,我的api会以用户类列表作出响应,如下所示: 我的界面如下所示: 我从片段中这样称呼它: 我的类对象以及getter和setter如下所示: gson不应该看到“类”:[]数组并从中解析对象吗?我做错了什么
我如何使用改造来解析这个?我得到错误BEGIN_OBJECT但却是BEGIN_ARRAY 现在,我是这样分析的… 下面是adapter类 下面是接口RetroInterface.class 这是我在主要活动中的称呼 下面是json响应
我正试图让在我的回调中执行。出于某种原因,onFailure会不断被调用,即使服务器返回200个代码,我也会获取全部数据。 我不确定必须做什么才能正确执行,以便解析JSON并将对象添加到列表视图中。 相关片段:- 请求接口:- 公共接口请求接口{ 服务器响应类: php代码:- functions.php: 数据库操作: 这是我在服务器上的回复: 这是堆栈跟踪和异常: [Ljava.lang.St
改装建造者: 插件创建的数据类不对吗?或者我的服务不应该返回列表?我尝试过返回一个简单的BaseResponse对象,但这也不起作用。