Генерация и обработка JSON в JavaEE
Сегодня довольно сложно встретить веб-приложение или мобильное приложение, использующее для обмена информацией с бэкендами и сторонними системами формат данных, отличный от JSON.
Многие знают, что среди его основных преимуществ отмечаются такие, как простота, отсутствие избыточности при передаче (в сравнении с XML) и как следствие легковесность. На клиентской стороне, написанной на JavaScript или одном из его фреймворков, работа с JSON крайне проста и равносильна работе с обычным JS-объектом.
В качестве примера, обратимся к ресурсу Api.ipify.org, возвращающего клиентский IP-адрес в виде JSON-объекта, который присвоим некоторой переменной:
let ipAddress = { ip: "46.0.6.174" };
Как видно из примера, объект имеет единственное поле «ip», значение которого равно
let yourIp = ipAddress.ip;
Представим ситуацию
Предположим, если бы данный сервис в качестве технологического стека использовал бы платформу JavaEE. Для Java-разработчиков, имеющих опыт работы с JSON, хорошо известны такие библиотеки, как Gson, Jackson и прочие, которые отлично подходят для работы с этим форматом данных.
Однако поддержка API для работы с JSON в JavaEE из «коробки» зарегистрирована под JSR 353 и реализована, начиная с 7й версии. Основным пакетом является
Для описания приведённого выше примера с IP-адресом понадобиться простой класс IPAddress:
public class IPAddress { private String ip; // getter and setter }
Для конвертации объекта данного класса в JSON-строку понадобится создать экземпляр JsonObjectBuilder и добавить необходимые поля, используя метод «add»:
JsonObjectBuilder objectBuilder = Json.createObjectBuilder().add("ip", address.getIp());
Обратите внимание, что у метода «add» имеется достаточное количество перегруженных версий, позволяющих передавать значения различных типов в качестве второго значения второго аргумента. Для получения строкового значения на выходе достаточно выполнить:
JsonObject jsonObject = objectBuilder.build(); String jsonString = null; try(Writer writer = new StringWriter()) { Json.createWriter(writer).write(jsonObject); jsonString = writer.toString(); }
И этого по факту достаточно для получения строки из примера выше! Если же в качестве полей JSON-объекта также используются массивы, то для этого используются возможности класса JsonArrayBuilder, проинициализировав который необходимо передать в objectBuilder в качестве второго параметра.
JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); for(String ipAddress : person.getIpAddresses()) { arrayBuilder.add(ipAddress); } objectBuilder.add("ips", arrayBuilder);
Для полноты картины, также рассмотрим случай
Ситуация: парсинг JSON-строки выполняется средствами JavaEE, при этом на выходе получив Java-объект. Здесь также никаких сложностей нет:
JsonReader reader = Json.createReader(new StringReader(jsonString)); JsonObject jsonObject = reader.readObject(); IPAddress address = new IPAddress(); address.setIp(jsonObject.getString("ip"));
Для получения значения полей, представленных в виде массивов, используется:
JsonArray addressesJson = jsonObject.getJsonArray("ips"); List<String> ipAddresses = new ArrayList<>(); for (JsonString j : addressesJson.getValuesAs(JsonString.class)) { ipAddresses.add(j.getString()); }
В принципе, этих знаний достаточно, чтобы начать использовать встроенные механизмы JavaEE для генерации и обработки JSON в ваших приложениях без необходимости использования сторонних библиотек.
Есть вопрос? Напишите в комментариях!