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 ответа
Ваша проблема в том, что 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 на эту веб-страницу, чтобы увидеть больше красивых
и проверьте, все ли ключи хорошо хранятся.
Решение Необходимо получить каждый массив, а затем получить значение почтового индекса. Используется значение 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);
Надеюсь, это поможет.