1. 概要

このチュートリアルでは、 JSONポインターを使用して、JSONデータから情報をナビゲートおよびフェッチする方法を示します。

また、新しいデータの挿入や既存のキー値の更新などの操作を実行する方法も示します。

2. 依存関係の設定

まず、pom.xmlにいくつかの依存関係を追加する必要があります。

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

3. JSONポインター

JSON (「JavaScriptObject Notation」)は、システム間でデータを交換するための軽量フォーマットであり、元々はDouglasCrockfordによって指定されました。

JavaScript 構文を使用しますが、結果はプレーンテキストであるため、言語に依存しません。

JSONポインター( RFC 6901 )は、JSON Processing 1.1 API( JSR 374 )の機能です。 JSONドキュメントの値にアクセスするために使用できるStringを定義します。 これは、XPathがXMLドキュメントに対して行うことと関連している可能性があります。

JSONポインターを使用することで、JSONファイルからデータをフェッチして変更することができます。

4. データへのアクセス

JsonPointerCrudというクラスを実装して操作を実行する方法の例をいくつか見ていきます。

books.jsonという内容のJSONファイルがあるとします。

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

そのファイルのデータにアクセスするには、データを読み取り、JsonStructureに解析する必要があります。 これは、 InputStreamまたはFileReaderを受け入れるJson.createReader()メソッドを使用して実現できます。

これを行う方法は次のとおりです。

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. キーを削除します

キーを削除するには、最初にキーへのポインタを作成します。 次に、removeメソッドを使用します。

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ポインターを使用してJSONデータに対してさまざまな操作を実行する方法について説明しました。

そして、いつものように、このチュートリアルに関連するコードは、GitHubにあります。