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 .