Java EE 8 включает обновление API обработки JSON и обновляет его до последних стандартов IEFT для JSON. Они есть:
- JSON Pointer RFC 6901
- JSON Patch RFC 6902
- JSON Merge Patch RFC 7396
Я расскажу об этих темах в этом мини-сериале.
Начиная
Для начала работы с JSON-P вам понадобятся следующие зависимости из центрального репозитория Maven.
|
01
02
03
04
05
06
07
08
09
10
11
|
<dependency> <groupId>javax.json</groupId> <artifactId>javax.json-api</artifactId> <version>1.1</version></dependency><dependency> <groupId>org.glassfish</groupId> <artifactId>javax.json</artifactId> <version>1.1</version></dependency> |
JSON Patch
JSON Patch выражает последовательность операций для применения к целевому документу JSON. Операции отформатированы в нотации JSON-Pointer и могут выполнять операции добавления , копирования , перемещения , удаления , замены и тестирования .
Интерфейс JsonPatchBuilder является шлюзом в этом API и создается из статического метода createPatchBuilder () в классе Json . Выражение JSON Pointer передается одному из методов операции и применяется к документу JSON.
Операция замены
Операция замены выполняется методом replace () и передачей ему местоположения заменяемого элемента, выраженного в виде выражения JSON Pointer и значения замены.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
{"title": "Java EE: Only What's New","author": "Alex Theedom","chapters": [ "Chapter 1: Java EE 8 What’s New Overview", "Chapter 2: Java API for JSON Binding 1.0 (JSR 367)", "Chapter 3: Java EE Security API 1.0 (JSR 375)"],"released": true,"pages": 300,"sourceCode": { "repositoryName": "Java-EE-8-Only-Whats-New", "url": "github.com/readlearncode/"},"otherBooks": [ { "title": "Professional Java EE Design Patterns", "length": 350 }]}JsonObject jsonObject = ... create JSONObject from JSON document ...; |
В приведенном ниже фрагменте кода и приведенном выше документе JSON значение первого элемента массива chapters , представленного выражением указателя JSON / chapters / 0 , заменяется значением Глава 1: Введение .
|
1
2
3
4
5
6
7
|
JsonPatchBuilder builder = Json.createPatchBuilder();JsonPatch jsonPatch = builder .replace("/chapters/0", "Chapter 1: Introduction") .build();JsonObject newJsonObject = jsonPatch.apply(jsonObject); |
Метод apply () возвращает экземпляр класса JsonStructure .
Операции добавления и удаления
Ключевой особенностью JSON Patch является возможность объединять несколько операций и последовательно применять их к результату предыдущего результата исправления. Если во время операции исправления возникает исключение, оно прекращает работу и в исходный документ JSON не вносятся никакие изменения.
В приведенном ниже примере кода показано, как добавлять и удалять элементы из документа JSON.
|
1
2
3
4
5
|
JsonObject newJsonObject = Json.createPatchBuilder() .add("/chapters/3", "Chapter 4: Servlets 4.0") .remove("/released") .build() .apply(jsonObject); |
Метод add () принимает выражение JSON Pointer, которое идентифицирует элемент, куда вставлять новые данные. Второй элемент — это новые данные для вставки.
Чтобы удалить элемент, передайте JSON-указатель удаляемого элемента в метод remove () .
Операции перемещения и копирования
Операция перемещения требует двух выражений JSON Pointer:
- один для элемента для перемещения и
- один для целевого местоположения, куда значение будет перемещено.
Целевое местоположение уже должно существовать и следует той же логике, что и операция добавления, в том смысле, что оно перемещает элемент в указанном месте с перемещаемым элементом. Все элементы эффективно сдвинуты на одну позицию вниз.
Операция копирования заменяет значение элемента значением другого элемента. Эта операция также требует двух выражений указателя JSON: одно для исходного значения и одно для местоположения цели.
Приведенный ниже фрагмент кода объединяет три операции: две операции перемещения и операции копирования.
|
1
2
3
4
5
6
|
JsonObject newJsonObject = Json.createPatchBuilder() .move("/chapters/0", "/chapters/2") .move("/chapters/2", "/chapters/1") .copy("/otherBooks/0/length", "/pages") .build() .apply(jsonObject); |
Операция перемещения перемещает значение, расположенное в третьей позиции массива глав, в первую позицию, затем перемещает элемент во второй позиции в третью позицию. Операция копирования копирует значение ключа страниц в ключ длины первого элемента в массиве otherBooks .
Тестовая операция
Тестовая операция определяет, задано ли указанное значение в документе JSON. Если тест не пройден, операции исправления прекращаются, в противном случае он продолжается и завершает оставшиеся операции.
В фрагменте кода проверяется элемент / pages . Если его значение равно 300, операция копирования продолжается, в противном случае выдается исключение JsonException .
|
1
2
3
4
5
|
JsonObject newJsonObject = Json.createPatchBuilder() .test("/pages", 300) .copy("/otherBooks/0/length", "/pages") // destination, source .build() .apply(jsonObject); |
Вывод
Ну вот и все для второй статьи этого мини-сериала о новых возможностях JSON Processing.
Это все на данный момент.
| Опубликовано на Java Code Geeks с разрешения Алекса Тидома, партнера нашей программы JCG. Посмотрите оригинальную статью здесь: Познакомьтесь с патчем JSON: Обзорная серия JSON-P 1.1
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |