当前位置: 首页 > 知识库问答 >
问题:

改装错误:预期BEGIN_OBJECT但BEGIN_ARRAY

谭学名
2023-03-14

我做了一个功能:输入身份证号码,点击提交按钮,然后获得身份证的基本信息。

我使用的模型是:

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": [ ]
}

我怎样才能修复这些漏洞?

共有3个答案

毕瀚
2023-03-14

返回数组时应使用响应列表,例如:

@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();

            }
        });
裘丰
2023-03-14

这是服务器的问题,在没有数据的情况下,它返回空数组,您的服务器API最有可能基于一些PHP框架。

它只能从后端排序,不能从应用程序排序,因为如果不更改类结构,就无法解析数组而不是对象。

所以问你的后端团队是否有可能改变这件事。空数组为空对象或没有键应该被发送。

在这种情况下可能发生的黑客行为:

是的,我知道确切的问题,它不能轻易改变,因为它是在框架级别。我建议你可以像这样修改代码

@GET("apistore/idservice/id")
Observable<JsonObject> getIdCardInfo(@Query("id") String id);

所以在此之后,您需要手动解析代码,然后需要将特定的密钥解析放在try-catch块中。例如,在try块中,如果面临异常,您将尝试将数据解析为对象,然后只为该对象值分配null。

曾涵育
2023-03-14

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对象,但这也不起作用。