Как работать с JSON Simple в Java
JSON в Java – тема, с которой требуется разобраться детально. Новичкам придется тяжело, так как находится в данном разделе огромное количество сложных терминов, а значит, без дополнительного материала не обойтись. Но благодаря этой статье, можно будет узнать подробно об API, самой сложности работы с JSON и так далее. Рекомендуется дочитать до конца эту статью – она сможет точно помочь при парсинге в Java и изучить элемент JSON хотя бы в базовой мере.
Обзор JSON SimpleAPI
Для обработки JSON используется дополнительное средство в Java. Если говорить проще, то называется оно API, а компания-разработчик языка назвали его JSON Simple. Этот инструмент состоит из многого количества классов, насчитывающих 13 штук. Однако, все они не требуются для обработки – нужно лишь 5 из всех их. Вот, что каждый из таковых представляет:
- Первый и самый простой класс в понимании – JSON Parser, разбирающий строку с JSON-содержимым. Пользователям придется применять такой элемент, когда используется java.io.Reader или полноценная строка кода. Ничего более другого не обрабатывается и никакого стороннего предназначения нет;
- Следующий класс, представляющий объект, называется JSON Object. Он наследует HashMap, а также хранит пары, называемые «ключ – значение». Но главное, что он делает – представляет JSON-строку, что позволяет таковому создавать видение объекта, над которым производятся действия. У данного класса присутствует метод write JSON String (Mapmap, Writerout), требуемый для конвертации мапы в строку кода, над которой, впоследствии, будут проводиться необходимые для пользователя действия;
- JSON Array является наследованным элементом ArrayList, который предназначается для реализации специальных интерфейсов. Можно сказать, что от JSON Array зависимы 2 других – JSON Aware и JSONStreamAware. Они же, в свою очередь, требуются для сторонних действий, необходимых впоследствии(если их нужно осуществить пользователю впоследствии);
- Присутствует в списке базовых еще JSON Value – класс для парсинга JSON-строки в объекты, необходимые для проведения всевозможных операций в Java. Дополнительно используется класс JSON Parser, а также применяется несколько полезных методов для создания JSON. Вдобавок, имеются специальные возможности(«escape», Strings) для работы с особыми символами – кавычками «», а также прочими, что возможно добавить(латинскими f, n, rи так далее);
- JSON Aware требуется для того, чтобы конвертироваться в специальный формат и реализовывать интерфейс для этого. Как и в случае со всеми остальными классами, без него не обойтись даже в стандартной работе с JSON, не говоря уже об углубленном применении разных средств разработки в Java.
Также можно выделять и далее классы JSON Simple, но с ними пользователь познакомится дальше сам, так как в процессе обучения с данной статьи нужно знать о самом главном. И что еще составляет базу изучения JSON-парсинга – разбор строки и создание нового элемента. К этому и переходит сейчас тема, чтобы человек мог без проблем в дальнейшем находить применение API в Java.
JSON Simple API. Пример разбора JSON-строки и создания нового JSON-объекта
Разобравшись с классами, рекомендуется приступить к рассмотрению примеров применения данных. Можно сделать парсинг JSON, к примеру, с содержимым, являющимся информацией о погоде в той или иной точке мира. Для самого начала рекомендуется создать maven-макет, который выглядит таким образом:
<!— 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>
Пользователю требуется также создать JSON Utils для парсинга готовых данных в JSON, представленных в виде строки для конвертации в стандартный объект вида JSON. Вот таким образом будет выглядеть код для первоначального примера:
packageua.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();
returnnull;
}
}
}
Вот таким образом пользователь может сделать стандартный парсинг JSON c помощью базовых классов API. Однако, требуется понимать, что это – еще не все, что нужно сделать в примере для получения конечного результата. Необходимо также создать Main-класс для работы с утилитами в JSON(Utils). Вот, как он будет выглядеть в данном случае:
packageua.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:
{«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»:»Солнечно»}
Однако, бывают и сложности при разборе. Они выражены в следующем:
- Запрос на погоду не проходит. Это обусловлено тем, что сервер не отвечает или что-то вроде такого. В таком случае, рекомендуется заменить ключ API на другой, чтобы попробовать с помощью другого ресурса выводить данные. Главное – чтобы работа не прекратилась у сервиса, что решает взять пользователь для своего примера;
- Если проблема возникает с maven макетом, то стоит заняться простым Javaпроектом, после чего добавить библиотеку jar. После этого, JSON Simple должен нормально функционировать и не вызывать трудностей и программиста-новичка.
На этом разбор примера JSON-парсинга подходит к концу. Такое возможно провернуть со многими типами данных. Главное, разобраться, какие требуются для обработки и как их использовать в парсинге с JSON.
JSON-парсеры
Что дополнительно нужно знать о парсинге на языке Java–набор JSON-инструментов. Они все имеют собственные плюсы и минусы, ввиду чего работа с каждым из таковых может быть сильно отлична друг от друга. И следовательно, придется подбирать под ситуацию и под себя отдельный способ парсинга. Вот, что можно использовать в процессе работы:
- DataBind – наиболее популярный способ, который обладает самыми базовыми параметрами для обработки JSON. Необходимо лишь указать класс для преобразования, уже сам язык Java делает всю работу за пользователя, включая перевод иерархии в JSON. Однако, если говорить коротко, то подходит такой вариант только тогда, когда не нужно обрабатывать многогигабайтные JSON, а также нет проблем с производительностью;
- TreeModel – представляет JSON в виде Java-классов, Node или JsonElement со специальной структурой иерархии. Отличие от DataBind в том, что получение информации сложнее – это должен делать непосредственно программист. Из недостатков отмечается также проблема с ограничением памяти и огромные по объему файлы;
- StreamingAPI – является наиболее низкоуровневым вариантом. Его можно использовать, но с трудом и подойдет таковой для продвинутых пользователей. Дело в том, что необходимо собирать токены для JSON. Но все это компенсируется двумя весомыми плюсами – минимально потребляется память, а следовательно, обеспечивается очень высокая производительность, которая очень ценится в процессе. В общем – рекомендуется такой способ исключительно программистам с опытом или терпеливым, желающим в этом разобраться, людям;
- Аналоги XPath – является такой способ дополнительным, но используется далеко не всегда. Он необходим только тогда, когда нужно взять информацию из JSON. К примеру, когда необходимо получить названия авторов книг в магазине, возможно прописать команду «$.store.book[*].author», после чего будет выведен результат пользователю. Однако, не работает в обратную сторону такой способ и дает далеко не всю информацию из файла JSON. Но плюс в том, что находятся данные по сложным критериям, что возможно не со всеми методами.
Как можно видеть, есть много способов получить требуемые данные из файла JSON. Главное – подобрать под себя вариант и работать с ним. А как это делается – уже указано в статье.