Статьи

Знакомство с патчем JSON: обзорная серия JSON-P 1.1

Java EE 8 включает обновление API обработки JSON и обновляет его до последних стандартов IEFT для JSON. Они есть:

Я расскажу об этих темах в этом мини-сериале.

Начиная

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