Перейти к основному содержимому

Обзор указателя JSON

· 4 мин. чтения

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 .