Статьи

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

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-Pointer

Указатель JSON определяет строковое выражение, которое ссылается на элемент в иерархической структуре документа JSON. С помощью выражения указателя JSON вы можете обращаться к документу JSON и манипулировать им, получая, добавляя, удаляя и заменяя элемент или значение, на которое ссылается выражение.

API ввода — это интерфейс javax.json.JsonPointer . Экземпляр создается путем вызова статического метода фабрики createPointer (выражение String) класса javax.json.Json и передачи ему выражения указателя.

Получить значение

Если приведен документ JSON ниже и вы хотите получить значение элемента title, вы создаете выражение / заголовок 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 ...;

Фрагмент кода ниже создает JsonPointer и ссылается на элемент title . Затем он вызывает метод getValue (), который передается в запрос JsonObject .

1
JsonValue jsonValue = Json.createPointer("/title").getValue(jsonObject);

Добавить значение

Чтобы добавить (или вставить) значение в документ JSON, следуйте той же логике, что и при извлечении, используя выражение указателя JSON для определения точки вставки в документе. Следующий фрагмент кода добавляет новую «категорию»: «Программирование» объекта JSON в корень документа.

1
2
3
JsonObject jsonObject = Json
      .createPointer("/category")
      .add(jsonObject, Json.createValue("Programming"));

Возвращаемый объект JsonObject — это весь новый измененный объект.

Удалить значение

Процесс удаления требует расположения значения для удаления, выраженного в виде выражения JSON Pointer. Приведенный ниже фрагмент кода удаляет элемент title и возвращает измененный документ JSON в качестве экземпляра JsonStructure.

1
JsonStructure jsonStructure = Json.createPointer("/title").remove(jsonObject);

Заменить значение

Чтобы заменить значение, выражение указателя JSON элемента, подлежащего замене, и элемента замены передается методу replace () . Приведенный ниже фрагмент кода заменяет значение элемента title и возвращает измененный документ JSON.

1
2
3
JsonStructure jsonStructure = Json
     .createPointer("/title")
     .replace(jsonObject, Json.createValue("Java EE 8"));

Проверьте значение

Существование значения в местоположении может быть проверено с помощью метода containsValue () . Приведенный ниже фрагмент кода проверяет, есть ли в месте значение, выраженное выражением JSON Pointer / doesNotExist .

1
2
3
Boolean containsValue = Json
     .createPointer("/doesNotExist")
     .containsValue(jsonObject);

Вывод

Ну вот и все для первой статьи в этой мини-серии о новых возможностях JSON Processing. Это все на данный момент.

Опубликовано на Java Code Geeks с разрешения Алекса Тидома, партнера нашей программы JCG. Посмотрите оригинальную статью здесь: Познакомьтесь с JSON Pointer: JSON-P 1.1 Обзор серии

Мнения, высказанные участниками Java Code Geeks, являются их собственными.