在 Android 中解析 JSON 时,Volley 抛出错误响应

Volley throws error response when parsing JSON in Android

我尝试在列表视图中解析 JSON 数据时抛出错误响应。是因为我的 JSON 数据在对象节点,而不是数组节点。

JSON数据

{
    "users": [{
        "userId": 1,
        "name": "Dya Vega",
        "profilePhoto": "https://graph.facebook.com/1301454197/picture?type=large",
        "dateMatched": "1/1/2015",
        "distance": "1 miles away",
        "status": "Online",
        "requestMessage": "Hi, can I know you?",
        "like": 234,
        "lastActive": "Active 1 hour ago"
    }, {
        "userId": 2,
        "name": "Esa Ezzatinor",
        "profilePhoto": "https://graph.facebook.com/1269334432/picture?type=large",
        "dateMatched": "1/1/2015",
        "distance": "2 miles away",
        "status": "Online",
        "requestMessage": "Hi, can I know you?",
        "like": 234,
        "lastActive": "Active 2 hour ago"
    }]
}

代码

// Creating volley request obj
        JsonArrayRequest userReq = new JsonArrayRequest(url,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString());
                        hidePDialog();

                        // Parsing json
                        for (int i = 0; i < response.length(); i++) {
                            try {

                                JSONObject obj = response.getJSONObject(i);
                                User user = new User();
                                user.setName(obj.getString("name"));
                                user.setProfilePhotoUrl(obj.getString("profilePicture"));
                                user.setLastActive(obj.getString("lastLogin"));

                                // adding movie to movies array
                                userList.add(user);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }

                        }

                        // notifying list adapter about data changes
                        // so that it renders the list view with updated data
                        adapter.notifyDataSetChanged();
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.d(TAG, "Error: " + error.getMessage());
                        hidePDialog();

                    }
                });

注:

=> 如果字符串包含 { 第一个字符,则字符串包含 JSONObject 作为根容器

=> 如果字符串包含 [ 第一个字符,则字符串包含 JSONArray 作为根容器

已发布 json 字符串包含 JSONObject 作为根而不是 JSONArray。使用 JsonObjectRequest 而不是 JsonArrayRequest 使用 Volley

向服务器发出请求

您在对象内的数组中有用户对象。所以你会想从 new JsonObjectRequest 开始。

已编辑:使用以下代码,您可以检索 JSONObject 类型 response,其中您有一个 JSONArray 类型 users,之后您可以遍历 JSONArray 并从中检索每个 JSONObject。

JsonObjectRequest req = new JsonObjectRequest(URL, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        JSONArray users = response.getJSONArray("users");
                        for (int i = 0; i < users.length(); i++) {
                          try {

                              JSONObject obj = users.getJSONObject(i);
                              User user = new User();
                              user.setName(obj.getString("name"));
                              user.setProfilePhotoUrl(obj.getString("profilePicture"));
                              user.setLastActive(obj.getString("lastLogin"));

                              // adding movie to movies array
                              userList.add(user);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        }
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.e("Error: ", error.getMessage());
                    }
                });

MainActivity onErrorResponse

JsonArrayRequest jArr = new JsonArrayRequest(url_select, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            Log.d(TAG, response.toString());

            // Parsing json
            for (int i = 0; i < response.length(); i++) {
                try {
                    JSONObject obj = response.getJSONObject(i);

                    Data item = new Data();

                    item.setId(obj.getString(TAG_ID));
                    item.setNama(obj.getString(TAG_NAMA));
                    item.setAlamat(obj.getString(TAG_ALAMAT));

                    // menambah item ke array
                    itemList.add(item);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            // notifikasi adanya perubahan data pada adapter
            adapter.notifyDataSetChanged();

            swipe.setRefreshing(false);
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
            swipe.setRefreshing(false);
        }
    });