Gsonの使い方(JSONをJava Objectsに変換)

gson_logo

前のAndroidアプリの開発で、JSONデータをJava Objectsに変換したかった。この時にGsonを知った。JSONデータのデシリアライズの方法を紹介する。

Gsonとは

GsonはJavaのライブラリで、JSONデータをJava Objectsに変換したり、Java ObjectsをJSONデータに変換したりすることが出来る。

以下は本家の開発サイト。オープンソースプロジェクト!

サンプルを淡々とのせると面白くないので、TwitterのAPIを呼び出すサンプルにした。Gsonのバージョンは2.0を使っている。

サンプルソースのダウンロードはこちら。お好きにどうぞ。

サンプル1:Twitterのユーザ情報を取得する

ユーザ情報JSON

まずは、JSONデータを呼び出せることを確認。

eiKatouは私のアカウント。自分のアカウント名でお試しあれ。

https://twitter.com/users/show/eiKatou.json

{
  id: 115794727,
  screen_name: "eiKatou",
  location: "兵庫県",
  name: "かとう えい",
  その他・・
}

上記の内容が入っている。このデータをJavaのオブジェクトへ変換する。

Javaへ変換して表示

public class User {
  String id;
  String screen_name;
  String name;
  @SerializedName("location")
  String basho;
}

上記はJSONデータを格納するUserクラス。

// JSON to Java
Gson gson = new Gson();
User user = gson.fromJson(jsonData.toString(), User.class);
System.out.println("id = " + user.getId());
System.out.println("screen name = " + user.getScreen_name());
System.out.println("name = " + user.getName());
System.out.println("basho = " + user.getBasho());

Userクラスを指定して、JSONをデシリアライズする。これを実行すると、対象のデータを表示する。

ポイント

  • JSONに対応するクラスを用意する
  • Javaクラスのフィールド名は、JSONのフィールド名と同じにする
  • JSONのフィールド名と別名にしたいときは、アノテーションを指定

サンプル2:Twitterのユーザタイムラインを取得する

ユーザタイムラインJSON

JSONデータを呼び出せることを確認。

私のTwitterID「115794727」を指定している。サンプル1を動かすと、TwitterIDが手に入る。

http://api.twitter.com/1/statuses/user_timeline/115794727.json

[{
    id_str: "170792755415625728",
    created_at: "Sat Feb 18 08:52:20 +0000 2012",
    user: {
      id: 115794727,
      location: "兵庫県",
      name: "かとう えい",
      その他省略・・
    },
    id: 170792755415625730,
    text: "今日はブログを書く。",
    その他省略・・
  }, {
    id_str: "170760803748818944",
    created_at: "Sat Feb 18 06:45:22 +0000 2012",
    user: {
      id: 115794727,
      location: "兵庫県",
      name: "かとう えい",
      その他省略・・
    },
    id: 170760803748818940,
    text: "WIRED.jp http://t.co/5X0hk4po",
    その他省略・・
  },
  その他のTweet省略・・
]

上記の内容が入っている(かなり省略した)。先ほどと違うのは、配列で返ってきていること。配列の中身はTweetの情報。

このデータをJavaのオブジェクトへ変換する。

Javaへ変換して表示

public class Tweet {
  private String id_str;
  private String id;
  private String text;
  private User user;
  // getter, setterは記述を省略・・
}

上記がTweetを格納するクラス。

// JSON to Java
Gson gson = new Gson();
Type collectionType = new TypeToken<Collection<Tweet>>(){}.getType();
List<Tweet> timeLine = gson.fromJson(jsonData.toString(), collectionType);
for (Tweet tweet : timeLine) {
  System.out.println("tweet user = " + tweet.getUser().name);
  System.out.println("id\_str = " + tweet.getId\_str());
  System.out.println("id = " + tweet.getId());
  System.out.println("text = " + tweet.getText());
  System.out.println();
}

コレクション型を指定して、JSONをデシリアライズする。実行すると、対象のTweetデータを表示する。20件ほど表示される。

ポイント

  • 配列が返ってくるときは、Type(コレクション)を指定する

サンプル3:Twitterのキーワード検索の結果

検索結果JSON

JSONデータを呼び出せることを確認。「eiKatou」で検索した場合のJSON。

http://search.twitter.com/search.json?q=eiKatou

{
  page: 1,
  query: "eiKatou",
  refresh\ _url: "?since\_id=170794708556197888&q=eiKatou",
  results: [{
      created_at: "Sat, 18 Feb 2012 09:00:06 +0000",
      from_user: "eiKatou",
      from\ _user\ _id: 115794727,
      from\ _user\ _id_str: "115794727",
      from\ _user\ _name: "かとう えい",
      id: 170794708556197900,
      id_str: "170794708556197888",
      text: "今日はいい天気。",
      省略・・
    }, {
      created_at: "Sat, 18 Feb 2012 09:00:06 +0000",
      from_user: "eiKatou",
      from\ _user\ _id: 115794727,
      from\ _user\ _id_str: "115794727",
      from\ _user\ _name: "かとう えい",
      id: 170794708556197900,
      id_str: "170794708556197888",
      text: "フォローミー!",
      省略・・
    },
    省略・・
  ],
  省略・・
}

上記の内容が入っている。先ほどと違うのは、オブジェクトの中に配列があること。

このデータをJavaのオブジェクトへ変換する。

Javaへ変換して表示

public class SearchResults {
  private int page;
  private String query;
  private List<Tweet> results;
  // getter, setterは記述を省略・・
    
}

上記はJSONデータを格納するSearchResultsクラス。

resultsはJSONのフィールド名と同じにしている。検索結果のTweetがresultsに入ってくる。

// JSON to Java
Gson gson = new Gson();
SearchResults results = gson.fromJson(jsonData.toString(),
SearchResults.class);
System.out.println("page = " + results.getPage());
System.out.println("query = " + results.getQuery());
System.out.println();
for (Tweet tweet : results.getResults()) {
  // tweet.getUser() is null.
  // System.out.println("tweet user = " + tweet.getUser().getName());
  System.out.println("id\_str = " + tweet.getId\_str());
  System.out.println("id = " + tweet.getId());
  System.out.println("text = " + tweet.getText());
  System.out.println();
}
  

これを実行すると、検索結果のtweet一覧が表示される。中に配列が入っていても簡単!

ポイント

  • オブジェクトの中の配列は、List型に入れてくれる

まとめ

Gsonを使うと簡単にデシリアライズできる。

他のJSON関係のライブラリに比べると、デシリアライズが早いらしい。なので、JSON関係のライブラリの本命だと思っている。開発が活発で、今後の機能追加も楽しみだ。

(追伸1)

Gson以外だと、JsonPullParserも気になっている。

(追伸2)

Gsonは、Androidでも使うことが出来る。AndroidでTwitterアプリを作りたい方、私好みのTwitterアプリを作ってください!