-1

I am writing an Android application that pulls JSON data from an SQL db.

In my Async Task class, I receive a JSON string from an HTTP request and I assign it to a JSONObject. This string contains various data, including an array of coordinates which I need. After that, I do obj.getJSONArray("coordinates"); As soon as I do that, my application throws an exception:

org.json.JSONObject cannot be converted to JSONArray in android

I am following this post's approach to solve my issues but with no luck:

org.json.JSONObject cannot be converted to JSONArray in android

I feel like I need to iterate over my JSON string until I see that array. I will post the string data below.

protected Void doInBackground(Void... voids) {
            HttpHandler sh = new HttpHandler();

            // Making a request to url and getting response
            String jsonStr = sh.makeServiceCall(address);

            //Log.e(TAG, "Response from url: " + jsonStr);
            if (jsonStr != null) {
                try {

                    JSONObject obj = new JSONObject(jsonStr);


                    JSONArray deviceJsonArray = obj.getJSONArray("coordinates"); //ERROR OCCURS HERE!

                    // looping through All Devices
                    for (int i = 0; i < deviceJsonArray.length(); i++) {
                        JSONObject json = deviceJsonArray.getJSONObject(i);

                        //String DeviceID = c.getString("id");
//                        longitude = json.getDouble("longitude");
//                        latitude =  json.getDouble("latitude");

                        Device device = new Device();
                        device.setName(receivedDeviceName);

                        //Adding the information to the array.
                        coordinatesArray.add(device);
                    }

                    //Log.e(TAG, "arraylist: " + coordinatesArray);
                } catch (final JSONException e) {
                    Log.e(TAG, "Json parsing error: " + e.getMessage());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getApplicationContext(),
                                    "Json parsing error: " + e.getMessage(),
                                    Toast.LENGTH_LONG)
                                    .show();
                        }
                    });

                }
            } else {
                Log.e(TAG, "Couldn't get json from server.");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Couldn't get json from server. Check LogCat for possible errors!",
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });
            }

            return null;
        }

JSON string value:

{"data":{"type":"gps","total_distance":18,"coordinates":[{"latitude":49.169209,"longitude":-122.990952,"time":"12:02:38 AM"},{"latitude":49.16922,"longitude":-122.990959,"time":"2:42:33 PM"},{"latitude":49.1693,"longitude":-122.988098,"time":"5:16:33 PM"},{"latitude":49.170979,"longitude":-122.968239,"time":"5:18:33 PM"},{"latitude":49.174992,"longitude":-122.962502,"time":"5:20:33 PM"},{"latitude":49.17688,"longitude":-122.95768,"time":"5:22:33 PM"},{"latitude":49.182232,"longitude":-122.960297,"time":"5:24:33 PM"},{"latitude":49.18581,"longitude":-122.950813,"time":"5:26:33 PM"},{"latitude":49.188869,"longitude":-122.945969,"time":"5:28:33 PM"},{"latitude":49.197689,"longitude":-122.948502,"time":"5:30:33 PM"},{"latitude":49.20216,"longitude":-122.947418,"time":"5:32:33 PM"},{"latitude":49.2071,"longitude":-122.949593,"time":"5:34:33 PM"},{"latitude":49.213051,"longitude":-122.938522,"time":"5:36:33 PM"},{"latitude":49.215462,"longitude":-122.93399,"time":"5:38:33 PM"},{"latitude":49.216381,"longitude":-122.932297,"time":"5:40:33 PM"},{"latitude":49.218769,"longitude":-122.92791,"time":"5:42:33 PM"},{"latitude":49.221062,"longitude":-122.923653,"time":"5:44:33 PM"},{"latitude":49.227119,"longitude":-122.912392,"time":"5:46:33 PM"},{"latitude":49.234489,"longitude":-122.89872,"time":"5:48:33 PM"},{"latitude":49.235699,"longitude":-122.894608,"time":"5:50:33 PM"},{"latitude":49.241928,"longitude":-122.89257,"time":"5:52:33 PM"},{"latitude":49.241871,"longitude":-122.89016,"time":"6:02:33 PM"}]}}

Could someone see what I am doing wrong or recommend a fix please?

asus
  • 1,427
  • 3
  • 25
  • 59

1 Answers1

2

Try this instead:

JSONObject obj = new JSONObject(jsonStr);

JSONObject objData = obj.getJSONObject("data");
JSONArray deviceJsonArray = objData.getJSONArray("coordinates");

The "coordinates" JSONArray is one element deeper in your JSON structure

Barns
  • 4,850
  • 3
  • 17
  • 31
  • assigning `obj.getJSONObject("data")` to `objData` throws an error because one type JSONArray and the other JSONObject – asus May 02 '18 at 22:00
  • your answer needs one small fix. second line should be `JSONObject objData = obj.getJSONObject("data");` – asus May 02 '18 at 22:07
  • 1
    @asus Thanks! I was too quick with the copy/paste and neglected to change the object type to `JSONObject` – Barns May 02 '18 at 22:38