Не получается достать jsonArray из json(null)

103
15 марта 2021, 14:30

Задача: достать все посты из открытой группы.

Json: {"response":{"count":2,"items":[{"id":4,"from_id":-186757790,"owner_id":-186757790,"date":1561831569,"marked_as_ads":0,"post_type":"post","text":"test_2","post_source":{"type":"vk"},"comments":....

Код:

public static void parseCurrentWeatherJson(String resultJson) {
        try {
            // конвертируем строку с Json в JSONObject для дальнейшего его парсинга
            JSONObject weatherJsonObject = (JSONObject) JSONValue.parseWithException(resultJson);
            JSONObject response = (JSONObject) weatherJsonObject.get("response");
            System.out.println("response: " + response);
            // получаем название города, для которого смотрим погоду
            System.out.println("count: " + response.get("count"));
            JSONArray weatherArray = (JSONArray) weatherJsonObject.get("items");
            System.out.println(weatherArray);
            // достаем из массива первый элемент
            JSONObject weatherData = (JSONObject) weatherArray.get(1);
        } catch (org.json.simple.parser.ParseException e) {
            e.printStackTrace();
        }
    }

Вывод: Полученный JSON: {"response":{"count":2,"items":[{"id":4,"from_id":-183957790,"owner_id":-183957790,"date":1561831569,"marked_as_ads":0,"post_type":"post","text":"test_2","post_source":{"type":"vk"},"comments":...

count: 2

null

Exception in thread "main" java.lang.NullPointerException
    at jsonParsers.PostsParser.parseCurrentWeatherJson(PostsParser.java:57)
    at Main.main(Main.java:28)

count достался без проблем, а вот список он не видет и говорит что он null, в чем может быть проблема ? Заранее спасибо

Answer 1
public static void parseCurrentWeatherJson(String resultJson) {
    try {           
        JSONObject response = (JSONObject) ((JSONObject) JSONValue.parseWithException(resultJson)).get("response");
        JSONArray weatherArray = (JSONArray) response.get("items");            
        JSONObject weatherData = (JSONObject) weatherArray.get(0);
        System.out.println(weatherData.keySet()); // you can see all objects keys 
        System.out.println(weatherData.get("owner_id"));//get value of 'owner_id' for example
    } catch (org.json.simple.parser.ParseException e) {
        e.printStackTrace();
    }
}

Но вообще это плохой подход. Создайте из своих JSON соответсвующие классы и передавайте их сериализатору, чтобы получать из них объекты с инициализированными полями, а не выбирать каждый элемент руками. Помните, как устроена ORM? Есть класс и он соответсвует таблице в БД. Так и тут - есть класс(несколько классов) и он соответствует джейсону. Таким образом получается то, что называется адаптер. Все обращения к апи идут через этот самый адаптер, который формирует запросы и парсит ответы в джава-объекты, а уже ваше приложение работает только с джава кодом и ничего не знает не про какие джейсоны. в противном случае, как минимум, вы размажете обращение к апихе равномерным слоем по всему своему коду и каждое изменение апихи сайта будет болью. Чтобы преобразовать ваш джейсон в класс существует огромное количество онлайн - конвертеров, которые легко справятся с этой задачей. например, этот http://pojo.sodhanalibrary.com

READ ALSO
Отладка исходных кодов .Net Framework в Visual Studio

Отладка исходных кодов .Net Framework в Visual Studio

Например, при разработке и в процессе отладке java кода в idea можно проваливаться во внутреннюю реализацию пакетов и классов JDKЕсть ли что-то...

101
Форма обратной связи лишь цифры на клавиатуре

Форма обратной связи лишь цифры на клавиатуре

Интересует такой вопрос есть сайт на Yii2, как сделать так чтобы при клике в форме обратной связи на номер телефона, на клавиатуре телефона...

123
Баг при делении на ноль

Баг при делении на ноль

Начну из далекаПисал калькулятор, и до определённого момента у меня при делении на 0 выводило Error (как и должно было), но почему-то позже это...

83
Скачивание картинки по прямой ссылке в браузере

Скачивание картинки по прямой ссылке в браузере

Нужно сделать так что бы по клику на картинку, она начинала скачиваться пользователю на компьютерСсылка на картинку приходит от сервера

96