Генерация и обработка JSON в JavaEE | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Backend-разработчик на PHP Алгоритмы и структуры данных Team Lead Архитектура и шаблоны проектирования Разработчик IoT C# Developer. Professional HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Symfony Framework Unity Game Developer. Basic JavaScript Developer. Professional Android Developer. Basic JavaScript Developer. Basic Java Developer. Professional Highload Architect Reverse-Engineering. Professional Java Developer. Basic Web-разработчик на Python Framework Laravel Cloud Solution Architecture Vue.js разработчик Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool" PHP Developer. Basic
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK Administrator Linux. Professional Дизайн сетей ЦОД Разработчик IoT PostgreSQL Экспресс-курс "Версионирование и командная работа с помощью Git"
-30%
Microservice Architecture Highload Architect MS SQL Server Developer Разработчик программных роботов (RPA) на базе UiPath и PIX Разработчик голосовых ассистентов и чат-ботов Administrator Linux. Advanced Infrastructure as a code Супер-практикум по использованию и настройке GIT Administrator Linux.Basic Экспресс-курс «IaC Ansible» Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» Основы Windows Server
Корпоративные курсы
Безопасность веб-приложений IT-Recruiter Дизайн сетей ЦОД Компьютерное зрение Разработчик IoT Вебинар CERTIPORT Machine Learning. Professional
-6%
NoSQL Пентест. Практика тестирования на проникновение Java QA Engineer. Базовый курс Руководитель поддержки пользователей в IT
-8%
SRE практики и инструменты Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Infrastructure as a code Супер-практикум по использованию и настройке GIT Промышленный ML на больших данных Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» BPMN: Моделирование бизнес-процессов Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

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

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

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
1 комментарий
0

Спасибо!

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