Обзор JSON Pointer

Обзор JSON Pointer

1. Overviewс

В этом руководствеwe’ll show how to use JSON Pointer to navigate and fetch information from JSON data.

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

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

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


    org.glassfish
    javax.json
    1.1.2

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

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

Хотя он использует синтаксисJavaScript,it’s language-independent, since the resultant is plain text.

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

Используя JSON Pointer, мы можем получать данные и изменять файл 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());

Обратите внимание, чтоthe first character of thisStringis a ‘/' * - это синтаксическое требование *.

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

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 будет его обрабатывать. The method createValue is overloaded to accept String, int, long, double, BigDecimal and 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. Обновить ключ-значение

To update a value we need to create the new value first. После того, как значение создано, мы используем метод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. Показать полное содержимое файла

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

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

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

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

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

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