«1. Обзор

В этом руководстве мы покажем, как использовать JSON Pointer для навигации и извлечения информации из данных JSON.

Мы также покажем, как выполнять такие операции, как вставка новых данных или обновление существующих пар \»ключ-значение\».

2. Настройка зависимостей

Во-первых, нам нужно добавить некоторые зависимости в наш pom.xml:

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1.2</version>
</dependency>

3. Указатель JSON

JSON («Объектная нотация JavaScript») — это облегченный формат. для обмена данными между системами, изначально заданными Дугласом Крокфордом.

Хотя он использует синтаксис JavaScript, он не зависит от языка, поскольку в результате получается простой текст.

JSON Pointer (RFC 6901) — это функция JSON Processing 1.1 API (JSR 374). Он определяет строку, которую можно использовать для доступа к значениям в документе JSON. Это может быть связано с тем, что делает XPath для XML-документа.

С помощью указателя JSON мы можем извлекать данные из файла JSON и изменять его.

4. Доступ к данным

Мы рассмотрим несколько примеров выполнения операций с помощью реализации класса JsonPointerCrud.

Предположим, у нас есть файл JSON с именем books.json с содержимым:

{
    "library": "My Personal Library",
    "books": [
        { "title":"Title 1", "author":"Jane Doe" },
        { "title":"Title 2", "author":"John Doe" }
    ]
}

Чтобы получить доступ к данным из этого файла, нам нужно прочитать его и преобразовать в JsonStructure. Мы можем добиться этого с помощью метода Json.createReader(), который принимает InputStream или FileReader.

Вот как мы можем это сделать:

JsonReader reader = Json.createReader(new FileReader("books.json"));
JsonStructure jsonStructure = reader.read();
reader.close();

Содержимое будет храниться в объекте JsonStructure. Это объект, который мы будем использовать для выполнения следующих операций.

4.1. Извлечение данных из файла

Чтобы получить одно значение, мы создаем JsonPointer, сообщая, из какого тега мы хотим получить значение:

JsonPointer jsonPointer = Json.createPointer("/library");
JsonString jsonString = (JsonString) jsonPointer.getValue(jsonStructure);
System.out.println(jsonString.getString());

Обратите внимание, что первый символ этой строки — «/». — это синтаксическое требование.

Результат этого фрагмента:

My Personal Library

Чтобы получить значение из списка, нам нужно указать его индекс (где первый индекс равен 0):

JsonPointer jsonPointer = Json.createPointer("/books/1");
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
System.out.println(jsonObject.toString());

Это выводит: ~~ ~

"title":"Title 2", "author":"John Doe"

4.2. Проверка наличия ключа в файле

С помощью метода containsValue мы можем проверить, присутствует ли значение, используемое для создания указателя, в файле JSON:

JsonPointer jsonPointer = Json.createPointer("/library");
boolean found = jsonPointer.containsValue(jsonStructure);
System.out.println(found);

Результат для этого фрагмента: ~~ ~

true

4.3. Вставить новый ключ-значение

Если нам нужно добавить новое значение в JSON, createValue будет обрабатывать его. Метод createValue перегружен, чтобы принимать String, int, long, double, BigDecimal и BigInteger:

JsonPointer jsonPointer = Json.createPointer("/total");
JsonNumber jsonNumber = Json.createValue(2);
jsonStructure = jsonPointer.add(jsonStructure, jsonNumber);
System.out.println(jsonStructure);

Опять же, наш вывод:

{
    "library": "My Personal Library",
    "total": 2,
    "books": [
        { "title":"Title 1", "author":"Jane Doe" },
        { "title":"Title 2", "author":"John Doe" }
    ]
}

4.4. Обновить ключ-значение

Чтобы обновить значение, нам нужно сначала создать новое значение. После создания значения используем метод replace из указателя, созданного с использованием ключевого параметра:

JsonPointer jsonPointer = Json.createPointer("/total");
JsonNumber jsonNumberNewValue = Json.createValue(5);
jsonStructure = jsonPointer.replace(jsonStructure, jsonNumberNewValue);
System.out.println(jsonStructure);

Вывод:

{
    "library": "My Personal Library",
    "total": 5,
    "books": [
        { "title":"Title 1", "author":"Jane Doe" },
        { "title":"Title 2", "author":"John Doe" }
    ]
}

4.5. Удаление ключа

Чтобы удалить ключ, мы сначала создаем указатель на ключ. Затем мы используем метод удаления:

JsonPointer jsonPointer = Json.createPointer("/library");
jsonPointer.getValue(jsonStructure);
jsonStructure = jsonPointer.remove(jsonStructure);
System.out.println(jsonStructure);

Результат:

{
    "total": 5,
    "books": [
        { "title":"Title 1", "author":"Jane Doe" },
        { "title":"Title 2", "author":"John Doe" }
    ]
}

4.6. Показать полное содержимое файла

Если указатель создается с пустой строкой, извлекается все содержимое:

JsonPointer jsonPointer = Json.createPointer("");
JsonObject jsonObject = (JsonObject) jsonPointer.getValue(jsonStructure);
System.out.println(jsonObject.toString());

Этот пример кода выводит все содержимое jsonStructure.

5. Заключение

В этой быстрой статье мы рассмотрели, как работать с указателем JSON для выполнения различных операций с данными JSON.

И, как обычно, код, относящийся к этому руководству, закончился на GitHub.