You can simply give it a try and return null if the try failed. Or you can break your attempt up into little pieces to monitor where it fails.
/** * This method will return the JSONObject q0, if it exists * If it doesn't exist it will return NULL * */ private JSONObject getQZero(JSONObject json) { try { return json.getJSONObject("queue").getJSONObject("building").getJSONObject("q0"); } catch (JSONException e) { // This could be triggered either because there is no q0 // or because the JSON structure is different from what was expected. return null; } }
You could also go step by step, if you want to print logs for each level;
/** * This method will show where your jsonparsing fails. * It will throw a JSONOException if the json is way different from what * was expected, and otherwise it will print a log of where the parsing * failed. */ private JSONObject getQZero(JSONObject json) throws JSONException { // Stop if no queue if (! myObject.has("queue") { Log.d(TAG, "no queue!"); return null; } JSONObject queue = myObject.getJSONObject("queue"); // Stop if no building if (! queue.has("building") { Log.d(TAG, "no building!"); return null; } JSONObject building = queue.getJSONObject("building") // Stop if no q0 if (! building.has("q0")) { Log.d(TAG, "no q0!"); return null; } JSONObject q0 = building.getJSONObject("q0"); // Q0 is returned here. If the method returned earlier, it returned NULL // You could also do nested ifs, but the indentation gets crazy return q0; }