Эта статья является продолжением серии статей по работе с Json в Java. В прошлой статье мы разобрались с Json Simple API на примере, а в этой статье мы познакомимся с достаточно простым и удобным способом обработки Json в Java под названием JSON.org.
JSON.org — это одна из первых open source библиотек для работы с JSON в Java. Она достаточно проста в использовании, однако не является самой гибкой и быстрой из существующих.
Обзор библиотеки JSON.org
JSON.org содержит классы для разбора и создания JSON из обычной Java-строки. Также она имеет возможность преобразовывать JSON в XML, HTTP header, Cookies и многое другое.
Основу этой библиотеки составляют следующие классы:
- Класс
org.json.JSONObject
— хранит неупорядоченные пары типа ключ — значение. Значение могут быть типаString, JSONArray, JSONObject.NULL, Boolean и Number
. Класс JSONObject также содержит конструкторы для конвертации Java-строки в JSON и дальнейшего ее разбора в последовательность ключ-значений. - Класс
org.json.JSONTokener
используется для разбора JSON строки, а также используется внутри классов JSONObject и JSONArray - Класс
org.json.JSONArray
хранит упорядоченную последовательность значений в виде массива JSON элементов. - Класс
org.json.JSONWriter
представляет возможность получения Json. Он содержит такие полезные в работе методы, как append(String) — добавить строку в JSON текст, key(String) и value(String) методы для добавления ключа и значения в JSON строку. Также org.json.JSONWriter умеет записывать массив. org.json.CDL
— этот класс содержит методы для преобразования значений, разделенных запятыми, в объекты JSONArray и JSONArray.- Класс
org.json.Cookie
располагает методами для преобразования файлов cookie веб-браузера в JSONObject и обратно. - Класс
org.json.CookieList
помогает преобразовать список куки в JSONObject и обратно.
Добавление библиотеки json.org в проект
Для удобства я использовал среду разработки Intellij IDEA Community Edition. Если Вы не хотите создавать maven проект, то можете создать простой проект и вручную добавить .jar библиотеку в проект. Создадим maven проект и добавим в зависимости библиотеку org.json. Фрагмент файла pom.xml с зависимостями у меня выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 |
... <dependencies> <!-- https://mvnrepository.com/artifact/org.json/json --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20160810</version> </dependency> </dependencies> ... |
Когда Вы читаете эту статью, наверняка уже вышла новая версия библиотеки. Найти ее Вы сможете по ссылке в комментарии выше.
Пример работы с JSON.org в Java: разбор и создание JSON
Теперь перейдем к парсингу JSON. Для начала создадим класс JsonUtils, в котором напишем методы для парсинга определенных данных о погоде и формирования нового JSON объекта на основании наших данных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
package ua.com.prologistic.app; import org.json.CDL; import org.json.JSONArray; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; public class JsonUtils { /** * Метод для получения данных по указанной ссылке * * @param url - ссылка в виде объекта URL (Uniform Resource Locator) * @return содержимое страницы на указанной ссылке в @param url */ public static String parseUrl(URL url) { if (url == null) { return ""; } StringBuilder stringBuilder = new StringBuilder(); // открываем соедиение к указанному URL // помощью конструкции try-with-resources try (BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()))) { String inputLine; // построчно считываем результат в объект StringBuilder while ((inputLine = in.readLine()) != null) { stringBuilder.append(inputLine); } } catch (IOException e) { e.printStackTrace(); } return stringBuilder.toString(); } // парсим некоторые данные о погоде public static void parseCurrentWeatherJson(String resultJson) { // конвертируем строку с Json в JSONObject для дальнейшего его парсинга JSONObject weatherJsonObject = new JSONObject(resultJson); // получаем название города, для которого смотрим погоду System.out.println("Название: " + weatherJsonObject.get("name")); // получаем массив элементов для поля weather JSONArray weatherArray = (JSONArray) weatherJsonObject.get("weather"); // достаем из массива первый элемент JSONObject weatherData = (JSONObject) weatherArray.get(0); // печатаем текущую погоду в консоль System.out.println("Погода на данный момент: " + weatherData.get("main")); // и описание к ней System.out.println("Более детальное описание погоды: " + weatherData.get("description")); } // формируем новый JSON объект из нужных нам погодных данных public static String buildWeatherJson() { // для простоты примера просто хардкодим нужные данные в методе JSONObject jsonObject = new JSONObject(); // задаем идентификатор jsonObject.put("weather_id", 0); // создаем поле с именем jsonObject.put("name", "Лондон"); // используем функцию аккумулирования для добавления // элемента к существующему значению. В результате мы получим список значений jsonObject.accumulate("name", "Англия"); // добавляет элемент в уже существующий список jsonObject.append("name", "(Великобритания)"); // увеличиваем значение на единицу jsonObject.increment("weather_id"); jsonObject.put("main", "Солнечно"); jsonObject.put("description", "Мороз трескучий, На небе ни единой тучи"); // позволяет представить JSON в удобном для HTML виде System.out.println(JSONObject.quote(jsonObject.toString())); return jsonObject.toString(); } // конвертируем указанный JSONArray в отформатированную строку, // готовую для записи в файл формата CSV public static String convertJsonToCsv(String jsonString) { JSONObject jsonObject = new JSONObject(jsonString); return CDL.toString(jsonObject.getJSONArray("weather")); } // создаем объект URL из указанной в параметре строки public static URL createUrl(String link) { try { return new URL(link); } catch (MalformedURLException e) { e.printStackTrace(); return null; } } } |
Как видите, в коде нас также есть метод для конвертации указанного объекта JSONArray в отформатированную строку, готовую для записи в файл формата CSV.
Теперь напишем класс, в котором будем тестировать парсинг и создание json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package ua.com.prologistic.app; import java.net.URL; /** * Created by Andrew on 31.08.2016. */ public class Main { /** * Для простоты и удобства используем уже сформированную строку * с запросом погоды в Лондоне на данный момент * <p> * другие примеры запросов можете глянуть здесь * {@see <a href="http://openweathermap.org/current">openweathermap</a>} * также Вам понадобится свой API ключ appid */ public static final String WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather?q=London,uk" + "&units=metric&appid=241de9349721df959d8800c12ca4f1f3"; public static void main(String[] args) { // создаем URL из строки URL url = JsonUtils.createUrl(WEATHER_URL); // загружаем Json в виде Java строки String resultJson = JsonUtils.parseUrl(url); System.out.println("\nПолученный JSON:\n" + resultJson); // парсим полученный JSON и печатаем его на экран JsonUtils.parseCurrentWeatherJson(resultJson); // формируем новый JSON объект из нужных нам погодных данных String json = JsonUtils.buildWeatherJson(); System.out.println("\nСозданный нами JSON:\n" + json); // преобразуем массив с json содержимым в строку со значениями через запятую // то есть в строку, удобную для сохранения в CSV файл String csvString = JsonUtils.convertJsonToCsv(resultJson); System.out.println("\nСтрока для CSV файла:\n" + csvString); } } |
Обратите внимание на последний метод convertJsonToCsv()
. Такой подход очень часто используется для автоматической конвертации json в csv.
Теперь запустим наш проект и посмотрим на вывод в консоль:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Полученный JSON: {"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":26.48,"pressure":1008,"humidity":42,"temp_min":23,"temp_max":31.3},"visibility":10000,"wind":{"speed":3.6,"deg":140},"clouds":{"all":0},"dt":1473790077,"sys":{"type":1,"id":5091,"message":0.043,"country":"GB","sunrise":1473744838,"sunset":1473790624},"id":2643743,"name":"London","cod":200} Название: London Погода на данный момент: Clear Более детальное описание погоды: clear sky "{\"weather_id\":1,\"name\":[\"Лондон\",\"Англия\",\"(Великобритания)\"],\"description\":\"Мороз трескучий, На небе ни единой тучи\",\"main\":\"Солнечно\"}" Созданный нами JSON: {"weather_id":1,"name":["Лондон","Англия","(Великобритания)"],"description":"Мороз трескучий, На небе ни единой тучи","main":"Солнечно"} Строка для CSV файла: icon,description,main,id 01d,clear sky,Clear,800 |
Скачать готовый проект в Intellij IDEA можно по ссылке.
Как видите, у нас получилось достаточно быстро и просто распарсить JSON, который получили в ответ от погодного сервиса, а потом и создать свой JSON объект и конвертировать его в строку, готовую для записи в CSV файл. Однако есть и еще более удобные и мощные библиотеки по обработке JSON в Java.