【问题标题】:Android: Retrieving JSON objects from an array that is nested in another arrayAndroid:从嵌套在另一个数组中的数组中检索 JSON 对象
【发布时间】:2018-08-26 23:37:27
【问题描述】:

我正在尝试从另一个数组中的数组中获取 JSON 对象。请参阅下面我得到的 JSON:

{
"status": 0,
"message": "successfull",
"resp_body": [
    {
        "route_id": "4567657tyrthnhrthnyt65y",
        "distance": "200km",
        "route_duration": "2hrs",
        "express": true,
        "status": "active",
        "route_name": "nairobi-nyeri",
        "peak_fare": "250",
        "offpeak_fare": "200",
        "trips_assigned": [
            {
                "trip_id": "43tergf",
                "date": "2/2/16",
                "status": "enroute"
            },
            {
                "trip_id": "45i27563t34",
                "date": "12/12/12",
                "status": "finished"
            },
            {
                "trip_id": "365ttrg6",
                "date": "31/12/17",
                "status": "queded"
            }
        ],
        "vehicles_ assigned": [
            {
                "vehicle_id": "nai234",
                "date": "12/12/12"
            },
            {
                "vehicle_id": "nai234",
                "date": "12/12/12"
            },
            {
                "vehicle_id": "nai234",
                "date": "12/12/12"
            }
        ],
        "origin": [
            {
                "town": "nairobi",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "destination": [
            {
                "town": "nyeri",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "via": [
            {
                "town": "sagana",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            },
            {
                "town": "karatina",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ]
    },
    {
        "route_id": "erdbgthrr",
        "distance": "230km",
        "route_duration": "2hrs",
        "express": false,
        "route_name": "nairobi-sagana-karatina-nyeri",
        "status": "active",
        "peak_fare": "250",
        "offpeak_fare": "200",
        "trips_assigned": [
            {
                "trip_id": "43tergf",
                "date": "2/2/16",
                "status": "enroute"
            },
            {
                "trip_id": "45i27563t34",
                "date": "12/12/12",
                "status": "finished"
            },
            {
                "trip_id": "365ttrg6",
                "date": "31/12/17",
                "status": "queded"
            }
        ],
        "vehicles_ assigned": [
            {
                "vehicle_id": "nai234",
                "date": "12/12/12"
            },
            {
                "vehicle_id": "nai234",
                "date": "12/12/12"
            },
            {
                "vehicle_id": "nai234",
                "date": "12/12/12"
            }
        ],
        "origin": [
            {
                "town": "nairobi",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "destination": [
            {
                "town": "nyeri",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "via": [
            {
                "town": "sagana",
                "stage": "tea_room",
                "latitude": "12.35454545",
                "longitude": "9.68685578",
                "arrival_time": "3:14pm"
            },
            {
                "town": "karatina",
                "stage": "tea_room",
                "latitude": "12.35454545",
                "longitude": "9.68685578",
                "arrival_time": "3:14pm"
            }
        ]
    },
    {
        "route_id": "rtbgfnhr5t",
        "route_name": "nairobi-thika",
        "distance": "200km",
        "route_duration": "2hrs",
        "express": false,
        "status": "active",
        "peak_fare": "250",
        "offpeak_fare": "200",
        "trips_assigned": [
            {
                "trip_id": "43tergf",
                "date": "2/2/16",
                "status": "enroute"
            },
            {
                "trip_id": "45i27563t34",
                "date": "12/12/12",
                "status": "finished"
            },
            {
                "trip_id": "365ttrg6",
                "date": "31/12/17",
                "status": "queded"
            }
        ],
        "trip_progress": [
            {
                "current location": "nyeri",
                "latitude": "32.54554654",
                "longitude": "-1.4565657",
                "average_speed": "67.89 km/h",
                "remaining_kms": "0",
                "arrival_time": "4.00am",
                "trip_duration": "76mins"
            }
        ],
        "origin": [
            {
                "name": "nairobi",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "destination": [
            {
                "name": "nyeri",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "via": [
            {
                "name": "karatina",
                "latitude": "12.35454545",
                "longitude": "9.68685578",
                "arrival_time": "3:14pm"
            }
        ]
    },
    {
        "route_id": "rtbgfnhr5t",
        "route_name": "nairobi-thika",
        "distance": "200km",
        "route_duration": "2hrs",
        "express": false,
        "status": "active",
        "peak_fare": "250",
        "offpeak_fare": "200",
        "trips_assigned": [
            {
                "trip_id": "43tergf",
                "date": "2/2/16",
                "status": "enroute"
            },
            {
                "trip_id": "45i27563t34",
                "date": "12/12/12",
                "status": "finished"
            },
            {
                "trip_id": "365ttrg6",
                "date": "31/12/17",
                "status": "queded"
            }
        ],
        "vehicles_ assigned": [
            {
                "vehicle_id": "nai234",
                "date": "12/12/12"
            },
            {
                "vehicle_id": "nai234",
                "date": "12/12/12"
            },
            {
                "vehicle_id": "nai234",
                "date": "12/12/12"
            }
        ],
        "origin": [
            {
                "town": "nairobi",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "destination": [
            {
                "town": "thika",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "via": []
    },
    {
        "departure_time": "2:00 pm",
        "e_t_a": "4:00 am",
        "express": false,
        "status": "finished",
        "date": "23/12/18",
        "route_name": "nairobi-thika",
        "trip_id": "12:00 am",
        "vehicle_id": "7HGF68",
        "trips_assigned": [
            {
                "trip_id": "43tergf",
                "date": "2/2/16",
                "status": "enroute"
            },
            {
                "trip_id": "45i27563t34",
                "date": "12/12/12",
                "status": "finished"
            },
            {
                "trip_id": "365ttrg6",
                "date": "31/12/17",
                "status": "queded"
            }
        ],
        "trip_progress": [
            {
                "current location": "nyeri",
                "latitude": "32.54554654",
                "longitude": "-1.4565657",
                "average_speed": "67.89 km/h",
                "remaining_kms": "0",
                "arrival_time": "4.00am",
                "trip_duration": "76mins"
            }
        ],
        "origin": [
            {
                "town": "thika",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "destination": [
            {
                "town": "thika",
                "stage": "tea_room",
                "latitude": "32.54554654",
                "longitude": "-1.4565657"
            }
        ],
        "via": [
            {
                "town": "thika",
                "stage": "tea_room",
                "latitude": "12.35454545",
                "longitude": "9.68685578",
                "arrival_time": "3:14pm"
            }
        ]
    }
]}

在上面的 JSON 正文中,我在

中有一个路由数组

“resp_body”

在每条路线中,我都有一个数组

“trips_assigned”

我的目标是在ListView 中列出路线,当点击路线时,检索该路线中的所有 trips_assigned。我下面的代码能够做到这一点,但会引发错误:

索引 3 超出范围 [0..3) W/System.err: at org.json.JSONArray.get(JSONArray.java:293) W/System.err: 在 org.json.JSONArray.getJSONObject(JSONArray.java:521)

当点击列表中的第四条路线时。

我的 Java 代码:

if ( jsonObject.getInt(getString(R.string.status)) == SUCCESS ) {
            respBody = jsonObject.getJSONArray(getString(R.string.resp_body));
            ArrayList<HashMap<String, String>> routeList = new ArrayList<HashMap<String, String>>();
            for(int i=0; i < respBody.length(); i++) {
                HashMap<String, String> temp = new HashMap<String, String>();
                temp.put("route_name", respBody.getJSONObject(i).getString(getString(R.string.route_name)));
                temp.put("route_distance", respBody.getJSONObject(j).getString(getString(R.string.status)));
                temp.put("peak_fare", respBody.getJSONObject(i).getString(getString(R.string.peak_fare)));
                temp.put("off_peak_fare", respBody.getJSONObject(i).getString(getString(R.string.offpeak_fare)));
                routeList.add(temp);

                tripsAssigned = (JSONArray) respBody.getJSONObject(i).get(getString(R.string.trips_assigned));
                for(j=0; j < tripsAssigned.length(); j++) {
                    perResult = respBody.getJSONObject(i);
                    noRecords.setVisibility(View.GONE);
                }

                RouteViewAdapter adapter = new RouteViewAdapter(getActivity(), routeList);
                if(routeList.size() < 1){
                    noRecords.setText("No routes to show.");
                } else {
                    listView.setVisibility(View.VISIBLE);
                    noRecords.setVisibility(View.GONE);
                }
                listView.setAdapter(adapter);
                pd.dismiss();
                listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                        try {


                            String t1 = perResult.getJSONArray(getString(R.string.trips_assigned)).getJSONObject(position).getString(getString(R.string.date));
                            String t2 = perResult.getJSONArray(getString(R.string.trips_assigned)).getJSONObject(position).getString(getString(R.string.status));
                            Toast.makeText(getActivity(), t1+t2, Toast.LENGTH_LONG).show();

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


                    }
                });

            }
            pd.dismiss();
        }

任何帮助将不胜感激。

【问题讨论】:

  • position 中的 onItemClick 值为 4,而 trips_assigned (JSONArray) 长度为 3,这就是您收到 Index 错误的原因。
  • 嘿,我建议你使用任何网络库,如改造或凌空。 retrofit library 你可以创建 gson 而不是 json creat pojo json pojo schema

标签: android arrays json arraylist android-volley


【解决方案1】:

试试这个。希望对你有帮助

   private void parseJson(JSONObject response) throws JSONException {

    JSONArray respBodyArray = response.optJSONArray("resp_body");
    if (respBodyArray != null){

        for (int i=0; i< respBodyArray.length(); i++){

            JSONObject arrayObject = (JSONObject) respBodyArray.get(i);

            String routeId = arrayObject.getString("route_id");

            JSONArray tripsAssignedArray = arrayObject.optJSONArray("trips_assigned");

            for (int j=0; j<tripsAssignedArray.length(); j++){

                JSONObject tripsAssignedArrayObject = (JSONObject) tripsAssignedArray.get(j);

                String tripId = tripsAssignedArrayObject.getString("trip_id");

            }

        }

    }

}

【讨论】:

  • 这只返回一项
猜你喜欢
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2018-02-06
  • 2019-08-11
  • 1970-01-01
  • 2021-11-17
  • 2021-07-27
相关资源
最近更新 更多