本格派エンジニアの工具箱

第29回 JavaオブジェクトとJSONオブジェクトの変換に便利な「Google Gson」

この記事を読むのに必要な時間:およそ 4 分

基本型→JSONの変換

前回は2回にわたってJavaプログラムでJSONデータを扱うための「Jackson Java JSON-processor」を紹介しました。今回はJSONデータを扱うもう1つのJavaライブラリ「Google Gson」を紹介します。Gsonの特徴は,JavaオブジェクトとJSONオブジェクトの変換を,シンプルなコードで行うことができる点です。字句解析を行えるような低レベルのAPIも備えていますが,それよりもオブジェクト変換の簡潔さに注力しているあたりがJacksonとの大きな違いと言えます。

Gsonはこのページよりダウンロードすることができます。「google-gson-2.1-release.zip 」をダウンロードして解凍し,中のjarファイルをクラスパスに含めて使用します。

Gsonを使う場合に重要なのは,GsonクラスのtoJson()メソッドとfromJson()メソッドの2つだけです。名前からも推察できるように,toJson()はJavaオブジェクトをJSONオブジェクトに変換するためのメソッド,fromJson()はおの逆にJSONからJavaへ変換するためのメソッドです。

まずは整数や文字列をJSON形式で出力してみましょう。次のようにGsonインスタンスを生成し,toJson()メソッドに整数や文字列を渡すと,JSON形式のテキストが返されます。配列も同様で,基本型の配列であればそのまま渡すだけでJSON配列に変換してくれます。

// Gsonオブジェクトを作成
Gson gson = new Gson();

// 基本型,String,配列からJSONへの変換
System.out.println(gson.toJson(123));        // 「123」と出力
System.out.println(gson.toJson("hello"));    // 「"hello"」と出力
int[] numbers = {1, 2, 3};
System.out.println(gson.toJson(numbers)); // 「[1,2,3]」と出力

toJson()メソッドでJSONデータを直接ファイルに出力することもできます。その場合,メソッドの第2引数にJsonWriterインスタンスを渡せば問題ありません。JsonWriterのコンストラクタには任意のWriterインスタンスを指定できるので,下記のようにここにFileWriterを渡せばいいわけです。ただし,JsonWriterを引数に取るtoJson()メソッドでは基本型を直接扱うことができないので,代わりにJsonPrimitiveクラスを使用する必要があります。

// ファイルへの書き出し
try (JsonWriter writer = 
     new JsonWriter(new BufferedWriter(new FileWriter("output1.json")))) {     
    gson.toJson(new JsonPrimitive("hello"), writer);
} catch (IOException ex) {
    ex.printStackTrace();
}

このコードを実行すると,output1.jsonとして次のようなJSONデータが生成されます。

"hello"

JSON→基本型の変換

JSON形式のデータをJavaオブジェクトとして読み込むにはfromJson()メソッドを利用します。その場合,引数にはJSON形式のStringオブジェクトと,変換後のJavaオブジェクトのClassインスタンスをセットで渡す必要があります。データ基本型や文字列,基本型の配列であれば,次のような具合です。

// Gsonオブジェクトを作成
Gson gson = new Gson();

// JSONから基本型,Stringへの変換
int number = gson.fromJson("123", int.class);
System.out.println(number);  // 「123」と出力
String text = gson.fromJson("\"hello\"", String.class);
System.out.println(text);        // 「hello」と出力
int[] array = gson.fromJson("[1, 2, 3]", int[].class);
System.out.println(array);      // 「[x@xxxx」(配列の文字列表現)と出力

ファイルから読み込む場合には,次のようにJsonReaderクラスを利用します。

// ファイルからの読み込み
try (JsonReader reader = 
     new JsonReader(new BufferedReader(new FileReader("output1.json")))) {     
  text = gson.fromJson(reader, String.class);
  System.out.println(text);       // 「hello」と出力
} catch (IOException ex) {
  ex.printStackTrace();
}

Javaオブジェクト→JSONの変換

次に,任意のJavaオブジェクトをJSON形式に変換して出力してみましょう。ここでは例として,次のようなNameクラスとUserクラスを使用します。NameオブジェクトがUserオブジェクトの要素になっている形です。

public class Name {
  private String first;
  private String last;

  public Name(String first, String last) {
    this.first = first;
    this.last = last;
  }
}
public class User {
  private Name name;
  private String mail;

  public User(Name name, String mail) {
    this.name = name;
    this.mail = mail;
  }

  @Override
  public String toString() {
    return "name:\n  " + name.getFirst() + "\n  " + name.getLast() + "\nmail:\n  " + mail;
  }
}

この場合も,先ほどと同様にtoJson()メソッドを利用します。ただし,今度は次のように対象となるJavaオブジェクトのClassインスタンスをセットで渡す必要があります。

// JSONファイルの書き出し
try (JsonWriter writer = 
     new JsonWriter(new BufferedWriter(new FileWriter("output2.json")))) {     
    // UserオブジェクトからJSONへの変換
    Name name = new Name("技評", "太郎");
    User user = new User(name, "taro@example.co.jp");
    gson.toJson(user, User.class, writer);
} catch (IOException ex) {
    ex.printStackTrace();
}

このコードを実行すると,output2.jsonとして次のようなJSONデータが生成されます。オブジェクトのネストも表現できていることがわかります。

{"name":{"first":"技評","last":"太郎"},"mail":"taro@example.co.jp"}

著者プロフィール

杉山貴章(すぎやまたかあき)

ONGS Inc.所属のプログラマ兼テクニカルライター。雑誌,書籍,Webメディアで多数の著作をもつ。

著書

コメント

コメントの記入