0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: java, java enterprise, gson, jackson, jsr 353, json api, javax.json, ipaddress, jsonobjectbuilder, jsonarraybuilder, objectbuilder, javaee</p>
1
<p>Теги: java, java enterprise, gson, jackson, jsr 353, json api, javax.json, ipaddress, jsonobjectbuilder, jsonarraybuilder, objectbuilder, javaee</p>
2
<p>Сегодня довольно сложно встретить веб-приложение или мобильное приложение, использующее для обмена информацией с бэкендами и сторонними системами формат данных, отличный от JSON.</p>
2
<p>Сегодня довольно сложно встретить веб-приложение или мобильное приложение, использующее для обмена информацией с бэкендами и сторонними системами формат данных, отличный от JSON.</p>
3
<p>Многие знают, что среди его основных преимуществ отмечаются такие, как простота, отсутствие избыточности при передаче (в сравнении с XML) и как следствие легковесность. На клиентской стороне, написанной на JavaScript или одном из его фреймворков, работа с JSON крайне проста и равносильна работе с обычным JS-объектом.</p>
3
<p>Многие знают, что среди его основных преимуществ отмечаются такие, как простота, отсутствие избыточности при передаче (в сравнении с XML) и как следствие легковесность. На клиентской стороне, написанной на JavaScript или одном из его фреймворков, работа с JSON крайне проста и равносильна работе с обычным JS-объектом.</p>
4
<p>В качестве примера, обратимся к ресурсу<a>Api.ipify.org</a>, возвращающего клиентский IP-адрес в виде JSON-объекта, который присвоим некоторой переменной:</p>
4
<p>В качестве примера, обратимся к ресурсу<a>Api.ipify.org</a>, возвращающего клиентский IP-адрес в виде JSON-объекта, который присвоим некоторой переменной:</p>
5
let ipAddress = { ip: "46.0.6.174" };<p>Как видно из примера, объект имеет единственное поле "ip", значение которого равно 46.0.6.174. Для получения значения из этого поля JS код выглядит крайне просто:</p>
5
let ipAddress = { ip: "46.0.6.174" };<p>Как видно из примера, объект имеет единственное поле "ip", значение которого равно 46.0.6.174. Для получения значения из этого поля JS код выглядит крайне просто:</p>
6
let yourIp = ipAddress.ip;<h2>Представим ситуацию</h2>
6
let yourIp = ipAddress.ip;<h2>Представим ситуацию</h2>
7
<p>Предположим, если бы данный сервис в качестве технологического стека использовал бы платформу JavaEE. Для Java-разработчиков, имеющих опыт работы с JSON, хорошо известны такие библиотеки, как<strong>Gson</strong>,<strong>Jackson</strong>и прочие, которые отлично подходят для работы с этим форматом данных.</p>
7
<p>Предположим, если бы данный сервис в качестве технологического стека использовал бы платформу JavaEE. Для Java-разработчиков, имеющих опыт работы с JSON, хорошо известны такие библиотеки, как<strong>Gson</strong>,<strong>Jackson</strong>и прочие, которые отлично подходят для работы с этим форматом данных.</p>
8
<p>Однако поддержка API для работы с JSON в JavaEE из "коробки" зарегистрирована под<strong>JSR 353</strong>и реализована, начиная с 7й версии. Основным пакетом является javax.json, в котором располагаются все необходимые классы и интерфейсы для работы с JSON.</p>
8
<p>Однако поддержка API для работы с JSON в JavaEE из "коробки" зарегистрирована под<strong>JSR 353</strong>и реализована, начиная с 7й версии. Основным пакетом является javax.json, в котором располагаются все необходимые классы и интерфейсы для работы с JSON.</p>
9
<p>Для описания приведённого выше примера с IP-адресом понадобиться простой класс<strong>IPAddress</strong>:</p>
9
<p>Для описания приведённого выше примера с IP-адресом понадобиться простой класс<strong>IPAddress</strong>:</p>
10
public class IPAddress { private String ip; // getter and setter }<p>Для конвертации объекта данного класса в JSON-строку понадобится создать экземпляр<strong>JsonObjectBuilder</strong>и добавить необходимые поля, используя метод "<strong>add</strong>":</p>
10
public class IPAddress { private String ip; // getter and setter }<p>Для конвертации объекта данного класса в JSON-строку понадобится создать экземпляр<strong>JsonObjectBuilder</strong>и добавить необходимые поля, используя метод "<strong>add</strong>":</p>
11
JsonObjectBuilder objectBuilder = Json.createObjectBuilder().add("ip", address.getIp());<p>Обратите внимание, что у метода "<strong>add</strong>" имеется достаточное количество перегруженных версий, позволяющих передавать значения различных типов в качестве второго значения второго аргумента. Для получения строкового значения на выходе достаточно выполнить:</p>
11
JsonObjectBuilder objectBuilder = Json.createObjectBuilder().add("ip", address.getIp());<p>Обратите внимание, что у метода "<strong>add</strong>" имеется достаточное количество перегруженных версий, позволяющих передавать значения различных типов в качестве второго значения второго аргумента. Для получения строкового значения на выходе достаточно выполнить:</p>
12
JsonObject jsonObject = objectBuilder.build(); String jsonString = null; try(Writer writer = new StringWriter()) { Json.createWriter(writer).write(jsonObject); jsonString = writer.toString(); }<p><strong>И этого по факту достаточно для получения строки из примера выше!</strong>Если же в качестве полей JSON-объекта также используются массивы, то для этого используются возможности класса<strong>JsonArrayBuilder</strong>, проинициализировав который необходимо передать в<strong>objectBuilder</strong>в качестве второго параметра.</p>
12
JsonObject jsonObject = objectBuilder.build(); String jsonString = null; try(Writer writer = new StringWriter()) { Json.createWriter(writer).write(jsonObject); jsonString = writer.toString(); }<p><strong>И этого по факту достаточно для получения строки из примера выше!</strong>Если же в качестве полей JSON-объекта также используются массивы, то для этого используются возможности класса<strong>JsonArrayBuilder</strong>, проинициализировав который необходимо передать в<strong>objectBuilder</strong>в качестве второго параметра.</p>
13
JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); for(String ipAddress : person.getIpAddresses()) { arrayBuilder.add(ipAddress); } objectBuilder.add("ips", arrayBuilder);<h2>Для полноты картины, также рассмотрим случай</h2>
13
JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); for(String ipAddress : person.getIpAddresses()) { arrayBuilder.add(ipAddress); } objectBuilder.add("ips", arrayBuilder);<h2>Для полноты картины, также рассмотрим случай</h2>
14
<p>Ситуация: парсинг JSON-строки выполняется средствами JavaEE, при этом на выходе получив Java-объект. Здесь также никаких сложностей нет:</p>
14
<p>Ситуация: парсинг JSON-строки выполняется средствами JavaEE, при этом на выходе получив Java-объект. Здесь также никаких сложностей нет:</p>
15
JsonReader reader = Json.createReader(new StringReader(jsonString)); JsonObject jsonObject = reader.readObject(); IPAddress address = new IPAddress(); address.setIp(jsonObject.getString("ip"));<p>Для получения значения полей, представленных в виде массивов, используется:</p>
15
JsonReader reader = Json.createReader(new StringReader(jsonString)); JsonObject jsonObject = reader.readObject(); IPAddress address = new IPAddress(); address.setIp(jsonObject.getString("ip"));<p>Для получения значения полей, представленных в виде массивов, используется:</p>
16
JsonArray addressesJson = jsonObject.getJsonArray("ips"); List<String> ipAddresses = new ArrayList<>(); for (JsonString j : addressesJson.getValuesAs(JsonString.class)) { ipAddresses.add(j.getString()); }<p>В принципе, этих знаний достаточно, чтобы начать использовать встроенные механизмы JavaEE для генерации и обработки JSON в ваших приложениях без необходимости использования сторонних библиотек.</p>
16
JsonArray addressesJson = jsonObject.getJsonArray("ips"); List<String> ipAddresses = new ArrayList<>(); for (JsonString j : addressesJson.getValuesAs(JsonString.class)) { ipAddresses.add(j.getString()); }<p>В принципе, этих знаний достаточно, чтобы начать использовать встроенные механизмы JavaEE для генерации и обработки JSON в ваших приложениях без необходимости использования сторонних библиотек.</p>
17
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
17
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
18
18