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, являются их собственными. |