Как достать нужный JSON?
Итак, на вход я получаю вот такой массив из JSON-объектов. Вопрос такой: как достать нужный мне по индексу объект с помощью Java? Эти данные я получаю в виде строки String.
[
{
"name": "London",
"local_names": {
"af": "Londen",
"ar": "لندن",
"ascii": "London",
"az": "London",
"bg": "Лондон",
"ca": "Londres",
"da": "London",
"de": "London",
"el": "Λονδίνο",
"en": "London",
"eu": "Londres",
"fa": "لندن",
"feature_name": "London",
"fi": "Lontoo",
"fr": "Londres",
"gl": "Londres",
"he": "לונדון",
"hi": "लंदन",
"hr": "London",
"hu": "London",
"id": "London",
"it": "Londra",
"ja": "ロンドン",
"la": "Londinium",
"lt": "Londonas",
"mk": "Лондон",
"nl": "Londen",
"no": "London",
"pl": "Londyn",
"pt": "Londres",
"ro": "Londra",
"ru": "Лондон",
"sk": "Londýn",
"sl": "London",
"sr": "Лондон",
"th": "ลอนดอน",
"tr": "Londra",
"vi": "Luân Đôn",
"zu": "ILondon"
},
"lat": 51.5085,
"lon": -0.1257,
"country": "GB"
},
{
"name": "London",
"local_names": {
"ar": "لندن",
"ascii": "London",
"bg": "Лондон",
"de": "London",
"en": "London",
"fa": "لندن، انتاریو",
"feature_name": "London",
"fi": "London",
"fr": "London",
"he": "לונדון",
"ja": "ロンドン",
"lt": "Londonas",
"nl": "London",
"pl": "London",
"pt": "London",
"ru": "Лондон",
"sr": "Лондон"
},
"lat": 42.9834,
"lon": -81.233,
"country": "CA"
},
{
"name": "London",
"local_names": {
"ar": "لندن",
"ascii": "London",
"en": "London",
"fa": "لندن، اوهایو",
"feature_name": "London",
"sr": "Ландон"
},
"lat": 39.8865,
"lon": -83.4483,
"country": "US",
"state": "OH"
},
{
"name": "London",
"local_names": {
"ar": "لندن",
"ascii": "London",
"en": "London",
"fa": "لندن، کنتاکی",
"feature_name": "London",
"sr": "Ландон"
},
"lat": 37.129,
"lon": -84.0833,
"country": "US",
"state": "KY"
},
{
"name": "London",
"local_names": {
"ascii": "London",
"ca": "Londres",
"en": "London",
"feature_name": "London"
},
"lat": 36.4761,
"lon": -119.4432,
"country": "US",
"state": "CA"
}
]
Ответы (1 шт):
Автор решения: Михаил Ребров
→ Ссылка
Для работы с JSON использую org.json
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20220320</version>
</dependency>
Код с подробными пояснениями
import org.json.JSONArray;
import org.json.JSONObject;
public class JSONProcessing {
public static void main(String[] args) {
// строка содержит упомянутый в вопросе Json
String jsonBody = "/** на этом месте должно быть содержание вашего json'а */";
// т.к. корень нашего документа - это массив,
// то на основе имеющейся строки создаем объект JSONArray
// если бы документ начинался и заканчивался { ... },
// то нужно было бы создать JSONObject
JSONArray root = new JSONArray(jsonBody);
// в переменной содержится индекс.
// при необходимости можно будет его вывести в параметры метода
int index = 0;
// из корневого массива по индексу получаем JSONObject
// назвал его cityJson
JSONObject cityJson = root.getJSONObject(index);
// по ключу name, получаем соответствующее поле
// обратите внимание на то, что я пользуюсь методом getString
// им можно получать только строки,
// если вы попытаетесь получить с помощью данного метода числа, массивы или другие объекты,
// то получите ошибку...
// для этих целей есть другие методы
String name = cityJson.getString("name");
// по ключу local_names получаем объект, содержащий локализованные названия города
// его я получаю с помощью метода getJSONObject
// именно об этом я говорил выше
// в качестве результата получаем объект типа JSONObject
JSONObject localNames = cityJson.getJSONObject("local_names");
// из него по ключу можем получить какое-то поле...
// например, содержащее французкое(наверное) название
String french = localNames.getString("fr");
// по ключу lat с помощью метода getFloat получаем широту
Float latitude = cityJson.getFloat("lat");
// аналогично с долготой
Float longitude = cityJson.getFloat("lon");
// как получать строки уже было и со страной должны сами разобраться
String country = cityJson.getString("country");
// форматируем все это дело для вывода
String out = String.format(
"name: %s\nfrench: %s\nlatitude: %f\nlongitude: %f\ncountry: %s",
name, french, latitude, longitude, country
);
// выводим
System.out.println(out);
}
}
Вывод
name: London
french: Londres
latitude: 51,508499
longitude: -0,125700
country: GB