android - 使用 Volley 进行响应处理

标签 android json android-volley

我在我的项目中使用 Volley 来处理网络请求。这是我的服务器返回的示例 JSON

JSON 对象响应

{"code":"success", "data":{"some data"}}

JSON 数组响应

{"code":"success", "data":["some data"]}

当发生验证错误或任何其他错误时,服务器返回以下响应:

{"code":"failed", "error":"Access denied"}

问题在于解析数据。当请求成功时,在 ResponseListeneronResponse 中,我只是获取 data 键的内容。在哪里,我期待的结果与我上面发布的结果相同。我不明白为什么 Volley 只返回 data 的内容而不是完整的 JSON。我之前也使用过 Volley。但从未遇到过此类问题。

解析代码:

private void getOnboardingCategories() {
    Response.Listener<JSONArray> responseListener = new Response.Listener<JSONArray>() {

        @Override
        public void onResponse(JSONArray response) {
            Log.d(LOG_TAG, "CATEGORY RESPONSE: " + response.toString());
            if (response != null) {
                int dataLength = response.length();
                for (int i = 0; i < dataLength; i++) {
                    JSONObject jObject = response.optJSONObject(i);
                    if (jObject != null) {
                        CategoryType2 categoryType2 = new CategoryType2();
                        categoryType2.set_id(jObject.optString("_id"));
                        categoryType2.setName(jObject.optString("name"));
                        categoryType2.setApp_icon_data(jObject.optString("thumbnail_data"));
                        categories.add(categoryType2);
                    }
                }
            }
            if (isVisible())
                sellAdapter.notifyDataSetChanged();
        }
    };

    Response.ErrorListener errorListener = new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            Util.errorHandler(error, ctx);
        }
    };

    JsonArrayRequest jsonObjectRequest = new JsonArrayRequest(Method.GET, url,
            null, responseListener, errorListener);
    MyApplication.getInstance().addToRequestQueue(jsonObjectRequest, "onboarding");
}

对成功的 react :

{
   code: "success",
   data: [
             {
                 _id: "55c06b05a3e0041a73cea744",
                 name: "Test Category 1",
                 thumbnail_data: "",
             },
             {
                 _id: "55c06b16a3e0046108cea744",
                 name: "Test Category 2",
                 thumbnail_data: "",
             }
         ]
}

ResponseListeneronResponse 中,我得到以下数据:

[
    {
        _id: "55c06b05a3e0041a73cea744",
        name: "Test Category 1",
        thumbnail_data: "",
    },
    {
        _id: "55c06b16a3e0046108cea744",
        name: "Test Category 2",
        thumbnail_data: "",
    }
]

发生错误时,服务器返回此响应:

{"code":"failed", "error":"error_msg"}

因此,Volley 抛出 ParseException,因为它期望 JSONArray。我需要向用户显示错误消息。早些时候,我使用的是 AsyncTask 并在那里处理了错误。但是,对于 Volley,我遇到了困难。我查看了 VolleyError,但没有得到任何线索。

更新 1

private void getOnboardingCategories() {
    showSpinnerDialog(true);
    Response.Listener<JSONObject> responseListener = new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            Log.d(LOG_TAG, "CATEGORY RESPONSE: " + response.toString());
            hideSpinnerDialog();
            String code = response.optString("code");
            if (code.equals("success")) {
                if (response != null) {
                    JSONArray dataArray = response.optJSONArray("data");
                    int dataLength = dataArray.length();
                    for (int i = 0; i < dataLength; i++) {
                        JSONObject jObject = dataArray.optJSONObject(i);
                        if (jObject != null) {
                            CategoryType2 categoryType2 = new CategoryType2();
                            categoryType2.set_id(jObject.optString("_id"));
                            categoryType2.setName(jObject.optString("name"));
                            categoryType2.setApp_icon_data(jObject.optString("app_icon_data"));
                            categories.add(categoryType2);
                        }
                    }
                }
            }
            if (isVisible())
                sellAdapter.notifyDataSetChanged();
        }
    };

    Response.ErrorListener errorListener = new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            Util.errorHandler(error, ctx);
        }
    };

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Method.GET, url,
            null, responseListener, errorListener);
    MyApplication.getInstance().addToRequestQueue(jsonObjectRequest, "onboarding");
}

更新 这个问题与 Volley 无关。服务器端 wrt gzip 压缩出现问题。我将投票赞成结束这个问题。

最佳答案

But, when error occurs, I get Parse exception, when making request for JSONArray

使用JSONObject. has()JSONObject. isNull()在解析 json 之前检查 json 响应中存在哪个键。

例如:

JSONObject jsonObject=new JSONObject(<server_response_string>);
  if(jsonObject.has("data") && !jsonObject.isNull("data"))
  {
    // get data JSONArray from response
  }else{
     // get message using error key
   }

关于android - 使用 Volley 进行响应处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32304216/

相关文章:

android - 如何在 Robolectric 的 ViewPager 上模拟拖动事件?

javascript - 如何使用在另一个 javascript 文件中调用的函数的 JSON 结果

Android Studio 管理默认导入

android - 如何在Android中获取联系人的电话号码

android - 为什么 Delphi 10.3 应用程序在 Android 11 中崩溃?

javascript - 将多维表单数据序列化为 JSON 对象数组以与 application/json 一起使用

javascript - 确保 Json 唯一

java - 首次启动应用程序时未显示 RecyclerView

java - 无法保留 Volley 响应值以供进一步使用,它变为空

java - Android Volley 空指针异常