Android не уверен, как ссылаться на значение в файле JSON (разбор JSON)

Пример страницы JSON http://maps.googleapis.com/maps/api/geocode/json?latlng=51.155455,-0.165058&sensor=true

@SuppressLint("NewApi")
public void readAndParseJSON(String in) {
    try {
        JSONObject reader = new JSONObject(in);
        // This works and returns address
        JSONArray resultArry = reader.getJSONArray("results");
        String Address = resultArry.getJSONObject(1).getString("formatted_address").toString();
        Log.e("Address", Address);
        // Trying to get PostCode on code below - this is not working (log says no value at address components)
        JSONArray postCodeArray  = reader.getJSONArray("address_components");
        String postCode =  postCodeArray.getJSONObject(1).getString("long_name").toString();
        Log.e("PostCode", postCode );

Этот код возвращает адрес правильно. Как я могу получить почтовый индекс long_name, который находится внутри address_components?

Решение Я должен был получить каждый массив, а затем получить значение почтового индекса. Я использую значение 7, так как это JSONObject, почтовый индекс которого хранится в поле "long_name".

JSONObject readerJsonObject = new JSONObject(in);
 readerJsonObject.getJSONArray("results");
 JSONArray resultsJsonArray = readerJsonObject.getJSONArray("results");
 JSONArray postCodeJsonArray = resultsJsonArray.getJSONObject(0).getJSONArray("address_components");
 String postCodeString =  postCodeJsonArray.getJSONObject(7).getString("long_name").toString();         
 Log.e("TAG", postCodeString);

Надеюсь, это поможет.

4 ответа

reader.getJSONObject(1).getJSONArray("address_components");

Ваша проблема в том, что results это JSONArray который содержит ребенка JSONObject состоит из нескольких детей: "address_components", "formatted_address", "geometry", а также "types", result На самом деле массив содержит много таких объектов, но сейчас давайте сосредоточимся только на первом дочернем объекте.

Посмотри внимательно на свой код. С этой строкой:

JSONArray resultArry = reader.getJSONArray("results");

Вы получаете весь results, Позже вы снова вызываете тот же метод:

JSONArray postCodeArray  = reader.getJSONArray("address_components");

Но вы просите "address_components" от читателя, где я не ожидаю, что вы найдете что-нибудь (уже прочитав весь результат раньше.) Вместо этого вы должны работать с JSONArray Вы уже получили раньше, так как он уже содержит весь результат.

Попробуйте что-то вроде:

JSONObject addressComponents = resultArry.getJSONObject(1).getJSONObject("address_components");
String postCode = addressComponents.getString("long_name");

Примечание: я не знаю, почему вы выделяете JSONObject #1 (в отличие от 0, который является первым, или любой другой из них), и я также не уверен, почему вы назвали String postCode. Так что, если я неправильно понял ваше намерение, я прошу прощения.

Трудно найти ошибку... потому что все выглядит хорошо. Проблема может существовать, когда вы создаете json.put("address_components", что-то);

Так что мой совет ставить точку останова на этой строке

 JSONArray postCodeArray  = reader.getJSONArray("address_components");

o показать JSON в LogCat

Log.d("Simple", reader.toString());

Затем вставьте свой JSON на эту веб-страницу, чтобы увидеть больше красивых

http://jsonviewer.stack.hu/

и проверьте, все ли ключи хорошо хранятся.

Решение Необходимо получить каждый массив, а затем получить значение почтового индекса. Используется значение 7, так как это JSONObject, почтовый индекс которого хранится в поле "long_name".

JSONObject readerJsonObject = new JSONObject(in);
 readerJsonObject.getJSONArray("results");
 JSONArray resultsJsonArray = readerJsonObject.getJSONArray("results");
 JSONArray postCodeJsonArray = resultsJsonArray.getJSONObject(0).getJSONArray("address_components");
 String postCodeString =  postCodeJsonArray.getJSONObject(7).getString("long_name").toString();         
 Log.e("TAG", postCodeString);

Надеюсь, это поможет.

Другие вопросы по тегам