Генерация и обработка JSON в JavaEE
2026-03-10 17:51 Diff

Теги: java, java enterprise, gson, jackson, jsr 353, json api, javax.json, ipaddress, jsonobjectbuilder, jsonarraybuilder, objectbuilder, javaee

Сегодня довольно сложно встретить веб-приложение или мобильное приложение, использующее для обмена информацией с бэкендами и сторонними системами формат данных, отличный от JSON.

Многие знают, что среди его основных преимуществ отмечаются такие, как простота, отсутствие избыточности при передаче (в сравнении с XML) и как следствие легковесность. На клиентской стороне, написанной на JavaScript или одном из его фреймворков, работа с JSON крайне проста и равносильна работе с обычным JS-объектом.

В качестве примера, обратимся к ресурсу Api.ipify.org, возвращающего клиентский IP-адрес в виде JSON-объекта, который присвоим некоторой переменной:

let ipAddress = { ip: "46.0.6.174" };

Как видно из примера, объект имеет единственное поле «ip», значение которого равно 46.0.6.174. Для получения значения из этого поля JS код выглядит крайне просто:

let yourIp = ipAddress.ip;

Представим ситуацию

Предположим, если бы данный сервис в качестве технологического стека использовал бы платформу JavaEE. Для Java-разработчиков, имеющих опыт работы с JSON, хорошо известны такие библиотеки, как Gson, Jackson и прочие, которые отлично подходят для работы с этим форматом данных.

Однако поддержка API для работы с JSON в JavaEE из «коробки» зарегистрирована под JSR 353 и реализована, начиная с 7й версии. Основным пакетом является javax.json, в котором располагаются все необходимые классы и интерфейсы для работы с JSON.

Для описания приведённого выше примера с 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 в ваших приложениях без необходимости использования сторонних библиотек.

Есть вопрос? Напишите в комментариях!