-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?

1 Answer 1

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

Sign up to request clarification or add additional context in comments.

3 Comments

assigning obj.getJSONObject("data") to objData throws an error because one type JSONArray and the other JSONObject
your answer needs one small fix. second line should be JSONObject objData = obj.getJSONObject("data");
@asus Thanks! I was too quick with the copy/paste and neglected to change the object type to JSONObject

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.