Этой статьей я начну серию публикаций по работе с JSON в Java. Для начала пройдусь по знакомым и простым решениям, а затем перейду к продвинутым библиотекам. Примером «простых решений» сегодня будет работа с Json Simple, а именно парсинг (разбор) существующего JSON объекта и создание нового.
Обзор Json Simple API
Json Simple — представляет собой простой API для обработки JSON. Сам API состоит из около 13 классов, основу которых составляют следующие 5 классов:
- Класс
JSONParser
предназначен для разбора строки с JSON-содержимым. Он принимает объектjava.io.Reader
или строку. - Класс
JSONObject
— это Java представление JSON строки. Класс JSONObject наследует HashMap и хранит пары ключ — значение. Также у него есть очень полезный метод writeJSONString(Map map, Writer out), который используется для конвертации мапы в JSON строку. - Класс
JSONArray
представляет собой коллекцию. Он наследует ArrayList и реализует интерфейсыJSONAware
иJSONStreamAware
. JSONValue
— класс для парсинга JSON строки в Java объекты. Для этого он использует класс JSONParser. JSONValue содержит множество полезных методов для создания JSON из различных типов, например, метод writeJSONString(Object value, Writer out) создаст JSON-строку из Java объекта. Он также имеет методы для работы со специальными (управляющими) символами используя метод escape(String s). С помощью этого метода можно безопасно работать с кавычками «» и такими символами, как \f, \t, \n, \, /, \r, \b и многими другими.- Интерфейс
JSONAware
. Класс должен реализовывать этот интерфейс, чтобы конвертироваться в JSON формат.
Json Simple API. Пример разбора JSON строки и создания нового JSON объекта
Ниже описан пример парсинга строки с JSON содержимым, а именно текущей погоды в каком-то городе. Я использовал сервис Openweathermap.org для получения данных о погоде.
Если Вы хотите просто попробовать JSON Simple API в действии и не хотите заморачиваться над получением этих данных с какого-то сервиса, то просто скопируйте полученный JSON по этой ссылке: openweather и используйте его в виде обычной строки в Java.
Создание maven проекта
Для удобства я создал простой maven проект в Intellij IDEA и добавил в зависимости последнюю версию json-simple в файле pom.xml:
1 2 3 4 5 6 |
<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple --> <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency> |
Теперь перейдем к созданию класса JsonUtils, в котором будут все необходимые методы для парсинга готового json в виде строки и создания нового 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 |
package ua.com.prologistic.app; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; 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); System.out.println(inputLine); } } catch (IOException e) { e.printStackTrace(); } return stringBuilder.toString(); } // парсим некоторые данные о погоде public static void parseCurrentWeatherJson(String resultJson) { try { // конвертируем строку с Json в JSONObject для дальнейшего его парсинга JSONObject weatherJsonObject = (JSONObject) JSONValue.parseWithException(resultJson); // получаем название города, для которого смотрим погоду System.out.println("Название города: " + weatherJsonObject.get("name")); // получаем массив элементов для поля weather /* ... "weather": [ { "id": 500, "main": "Rain", "description": "light rain", "icon": "10d" } ], ... */ JSONArray weatherArray = (JSONArray) weatherJsonObject.get("weather"); // достаем из массива первый элемент JSONObject weatherData = (JSONObject) weatherArray.get(0); // печатаем текущую погоду в консоль System.out.println("Погода на данный момент: " + weatherData.get("main")); // и описание к ней System.out.println("Более детальное описание погоды: " + weatherData.get("description")); } catch (org.json.simple.parser.ParseException e) { e.printStackTrace(); } } // формируем новый JSON объект из нужных нам погодных данных public static String buildWeatherJson() { // для простоты примера просто хардкодим нужные данные в методе JSONObject jsonObject = new JSONObject(); jsonObject.put("name", "Лондон"); jsonObject.put("main", "Солнечно"); jsonObject.put("description", "Мороз трескучий, На небе ни единой тучи"); return jsonObject.toJSONString(); } // создаем объект URL из указанной в параметре строки public static URL createUrl(String link) { try { return new URL(link); } catch (MalformedURLException e) { e.printStackTrace(); return null; } } } |
Теперь создадим Main класс для работы с утилитным методом парсинга и создания 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 |
package ua.com.prologistic.app; import java.net.URL; public class Main { /** * Для простоты и удобства используем уже сформированную строку * с запросом погоды в Лондоне на данный момент * <p> * другие примеры запросов можете глянуть здесь * {@see <a href="http://openweathermap.org/current">openweathermap</a>} * также Вам понадобится свой API ключ */ 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("Полученный JSON:\n" + resultJson); // парсим полученный JSON и печатаем его на экран JsonUtils.parseCurrentWeatherJson(resultJson); // формируем новый JSON объект из нужных нам погодных данных String json = JsonUtils.buildWeatherJson(); System.out.println("Созданный нами JSON:\n" + json); } } |
В ходе работы с Json Simple API по этому примеру у Вас могут возникнуть такие сложности:
- Если запрос на погодный сервис не проходит, то замените API ключ, который используется в примере, на свой.
- Если у Вас проблема с maven проектом, то можно создать простой Java проект и добавить вручную jar библиотеку Json Simple.
Теперь запустим приложение и посмотрим на результат выполнения в консоль:
1 2 3 4 5 6 7 |
Полученный JSON: {"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":521,"main":"Rain","description":"shower rain","icon":"09d"}],"base":"stations","main":{"temp":20.48,"pressure":1013,"humidity":64,"temp_min":18,"temp_max":23},"visibility":10000,"wind":{"speed":6.2,"deg":220},"rain":{"1h":0.2},"clouds":{"all":75},"dt":1472401589,"sys":{"type":1,"id":5091,"message":0.0429,"country":"GB","sunrise":1472360901,"sunset":1472410403},"id":2643743,"name":"London","cod":200} Название города: London Погода на данный момент: Rain Более детальное описание погоды: shower rain Созданный нами JSON: {"name":"Лондон","description":"Мороз трескучий, На небе ни единой тучи","main":"Солнечно"} |
В этой статье мы познакомились с простым способом парсинга/создания json, а в следующих статьях Вас ждут другие более удобные и популярные способы обработки json.
Скачать проект можно по этой ссылке.
Подписывайтесь на обновления и следите за новыми статьями!
Спасибо за статью! Но у вас опущен самый важный момент. Вы харткодите ссылку для запроса погоды, и не показываете как сформировать эту ссылку из json строки.
Мне интересен именно такой порядок:
1. Сформировать URL на основе JSON
2. Получить ответ от сервера и разобрать его.
А у вас получается первый пункт пропущен.
Здравствуйте, Дмитрий!
Вы можете сформировать ссылку с помощью класса URIBuilder. Указать эндпоинт и параметры запроса. Посмотреть другие параметры для запроса можно в документации openweathermap. Ниже я переписал формирование запроса с помощью URIBuilder:
Спасибо! То, что нужно.
А каким обрахом достать из json текущую температуру?
Попробовал на основе данных вариантов, но постоянно выдает ошибку.
Разобрался.
Не очень читабельно, слева на сайте столько места,когда заканчивается реклама, можно и его как — то использовать =) При просмотре кода, приходится код крутить туда — сюда, хотя слева еще треть экрана пустая.