Несколько дней новогоднего волшебства:
Успейте начать обучение в 2018-ом году со скидкой до 30%!
Выбрать курс

Генерация и обработка JSON в JavaEE

dXZXiUnyjZU-5020-48e99d.jpg

Сегодня довольно сложно встретить веб-приложение или мобильное приложение, использующее для обмена информацией с бэкендами и сторонними системами формат данных, отличный от 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 в ваших приложениях без необходимости использования сторонних библиотек.

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

Автор
0 комментариев
Для комментирования необходимо авторизоваться