Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのGsonストリーミングAPIでファイルを読み書きする方法を解説

GsonのストリーミングAPIを使用すると、ファイルへの読み書きが可能になります。このAPIはシーケンシャル(逐次)読み書きの標準に基づいて設計されており、メモリに全体を読み込まずに処理できるため、大きなJSONデータを扱う際にも効率的です。

ストリーミングAPIの中核となるのは、JsonWriterJsonReaderという2つのクラスです。JsonWriterは、JSONエンコードされた値をストリームへ1トークンずつ書き込みます。ストリームには、文字列・数値・ブール値・nullといったリテラル値に加え、オブジェクトや配列の開始・終了デリミタも含まれます。一方、JsonReaderは、JSONエンコードされた値をトークンのストリームとして読み取ります。トークンはJSONドキュメント内の出現順序、すなわち深さ優先順(depth-first order)で走査されます。

JsonWriterを使ってファイルに書き込む

以下の例では、JsonWriterを使用して「input.json」ファイルにオブジェクトと配列を含むJSONデータを書き込んでいます。beginObject()でオブジェクトの開始、name().value()でキーと値のペア、beginArray()/endArray()で配列を定義します。

コード例

import java.io.*;
import com.google.gson.stream.*;
public class JsonWriterTest {
    public static void main(String args[]) {
        JsonWriter writer;
        try {
            writer = new JsonWriter(new FileWriter("input.json"));
            writer.beginObject();
            writer.name("name").value("Adithya");
            writer.name("age").value(25);
            writer.name("technologies");
            writer.beginArray();
            writer.value("Java");
            writer.value("Scala");
            writer.value("Python");
            writer.endArray();
            writer.endObject();
            writer.close();
            System.out.println("Data write to a file successfully");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

出力結果

Data write to a file successfully

このプログラムを実行すると、「input.json」には次のようなJSONデータが出力されます。

{"name":"Adithya","age":25,"technologies":["Java","Scala","Python"]}

JsonReaderを使ってファイルを読み込む

次に、JsonReaderを使用して先ほど作成したJSONファイルを読み込みます。hasNext()でトークンの有無を確認しながらループ処理を行い、nextName()でキー名を取得して、値の種類に応じたnextString()nextInt()などで値を読み取ります。未知のキーに対してはskipValue()でスキップできる点もポイントです。

コード例

import java.io.*;
import com.google.gson.stream.*;
public class JsonReaderTest {
    public static void main(String args[]) {
        JsonReader reader;
        try {
            reader = new JsonReader(new FileReader("input.json"));
            reader.beginObject();
            while(reader.hasNext()) {
                String name = reader.nextName();
                if(name.equals("name")) {
                    System.out.println(reader.nextString());
                } else if(name.equals("age")) {
                    System.out.println(reader.nextInt());
                } else if(name.equals("technologies")) {
                    reader.beginArray();
                    while(reader.hasNext()) {
                        System.out.println(reader.nextString());
                    }
                    reader.endArray();
                } else {
                    reader.skipValue();
                }
            }
            reader.endObject();
            reader.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

出力結果

Adithya
25
Java
Scala
Python

このように、GsonのストリーミングAPIを活用することで、JSONデータをトークン単位で逐次的に処理でき、メモリ使用量を抑えながら高速な読み書きを実現できます。特に大規模なJSONファイルを扱う場合には、DOMベースのモデルよりもストリーミングAPIの方が適しています。

  1. 【Java】JSONオブジェクトをファイルに書き込む方法(json-simpleライブラリの使い方)

    JSON(JavaScript Object Notation)は、現在もっとも広く使われているデータ交換フォーマットのひとつです。軽量であることと、特定のプログラミング言語に依存しないことが大きな特徴で、異なるシステム間でのデータやり取りに最適です。 JavaでJSONファイルを読み書きするには、json-simple ライブラリが便利です。json-simpleは軽量なJSON処理ライブラリで、JSONテキストのエンコード(書き込み)とデコード(読み込み)の両方に対応しており、JSON仕様(RFC4627)に完全準拠しています。 ライブラリの準備 json-simpleを使用するには、まず

  2. JavaでJSONファイルを作成する方法をわかりやすく解説

    JSON(JavaScript Object Notation)は、人間が読みやすい形式でデータを交換するために設計された、軽量なテキストベースのオープン標準フォーマットです。JSONの記法は、C、C++、Java、Python、Perlなど、多くのプログラミング言語に精通したプログラマーにとって馴染み深いものとなっています。 JSONドキュメントのサンプル 以下は、書籍情報を格納した典型的なJSONドキュメントの例です。 { book: [ { id: 01, language: Java, ed