Simon A. Callaghan Jensen Simon A. Callaghan Jensen - 3 months ago 24
Android Question

Parsing JSONArray with Double in Android Studio

I am trying to parse

JSONArray
from a MySQL Database in Android Studio, but i get the following exception:

org.json.JSONException: Value {"success":false,"0":{"success":false,"marker_id":null,"lat":null,"lng":null,"snippet":null},"1":{"success":false,"marker_id":null,"lat":null,"lng":null,"snippet":null},"2":{"success":false,"marker_id":null,"lat":null,"lng":null,"snippet":null},"3":{"success":false,"marker_id":null,"lat":null,"lng":null,"snippet":null}} of type org.json.JSONObject cannot be converted to JSONArray


What i am trying to do is to parse several markers containing double values for LatLng, and then placing those markers in Google Maps.

Code for placing the markers and making the request:

Response.Listener<String> responseListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {

JSONArray jsonResponse = new JSONArray(response);
Log.i("RESPONSE:", "[" + jsonResponse + "]");


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

//boolean success = jsonResponse.getBoolean("success");
//double lat = jsonResponse.getDouble("lat");
//double lng = jsonResponse.getDouble("lng");
//int snippet = jsonResponse.getInt("snippet");



//LatLng Mplace = new LatLng(lat, lng);

//MarkerOptions marker = new MarkerOptions().position(Mplace).title("Marker").snippet("Snippet:" + "0");
//mMap.addMarker(marker);


}


} catch (JSONException e) {
e.printStackTrace();
Log.i("RESPONSE:", "[" + response + "]");
Toast.makeText(getApplicationContext(),
"Error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}

}

};

MarkerRequest markerRequest = new MarkerRequest(responseListener);
RequestQueue queue = Volley.newRequestQueue(AllMarkersActivity.this);
queue.add(markerRequest);


For now i have commented the actual placing of the markers and that is when i get the exception shown above. When i remove the commenting i get this red-text message:

getDouble (int) cannot be applied to (java.lang.String)


Here is my Request code:

public class MarkerRequest extends StringRequest {
private static final String MARKER_REQUEST_URL = "http://simonjensen.comxa.com/GetMarkers.php";
private Map<String, String> params;
//private JSONObject data = new JSONObject("http://simonjensen.comxa.com/GetMarkers.php");

public MarkerRequest(Response.Listener<String> listener){
super(Request.Method.POST, MARKER_REQUEST_URL, listener, null);
params = new HashMap<>();
}
@Override
public Map<String, String> getParams() {
return params;
}


And here is my PHP script:

<?php
$con = mysqli_connect("myhost", "myuser", "mypass", "mydatabase");

/*$statement = mysqli_prepare($con);

$sql = "SELECT * FROM markers ORDER BY marker_id ASC ";
$strSQL = "SELECT * FROM `markers` ORDER BY marker_id ASC ";

$objQuery = mysql_query($statement, $strSQL) or die(mysql_error());
$arrRows = array();
$arryItem = array();*/

$statement = mysqli_prepare($con, "SELECT * FROM markers ORDER BY marker_id ASC ");
mysqli_stmt_execute($statement);
//mysqli_stmt_bind_result($statement, $colmarker_id, $collat, $collng, $colsnippet);

//$response = array();
$arrRows = array();
$arryItem = array();
//$response["success"] = false;
$arrRows["success"] = false;
$arryItem["success"] = false;

while(mysqli_stmt_fetch($statement)) {
$arryItem["marker_id"] = $arr["marker_id"];
$arryItem["lat"] = $arr["lat"];
$arryItem["lng"] = $arr["lng"];
$arryItem["snippet"] = $arr["snippet"];
$arrRows[] = $arryItem;
}

echo json_encode($arrRows);
?>


So my question can be narrowed down to this:

How do i parse a
JSONArray
(within an array?), and how do i parse a double value within that
JSONArray
?

It would be nice with a code example, as i am still learning :)

Thanks!

Answer

As your response contain JSON Object and the outer JSON object contain inner JSON objects. So, first parse it in JSON Object then get Lat and lng. Try this code:

    JSONObject jsonObject = new JSONObject(response);
    Iterator<String> keys = jsonObject.keys();
    while( keys.hasNext() )
    {
        String key = keys.next();
                if(!key.equals("success")){   // or use this if your keys are always in digits form.. if(TextUtils.isDigitsOnly(key))
                    Log.v("category key", key);
                    JSONObject innerJObject = jsonObject.getJSONObject(key);
                    String lat_str = innerJObject.getString("lat");
                    double lat = 0.0, lng = 0.0;

                    if(!TextUtils.isEmpty(lat_str) &&      TextUtils.isDigitsOnly(lat_str))
                        lat = Double.parseDouble(lat_str);

                    String lng_str = innerJObject.getString("lng");

                    if(!TextUtils.isEmpty(lng_str) && TextUtils.isDigitsOnly(lng_str))
                        lng = Double.parseDouble(lng_str);

                }
    }

Add exception handling in this block. This might help!