2013年7月21日日曜日

[Java]JSONをPOJOにバインドする

JSONからPOJO(Bean)に変換する処理はめんどくさいです。リフレクションでルールを決めて変換。というのもめんどくさいですね。 そこで、JSONを解析するライブラリを利用します。 JSON系のライブラリはいくつかありますが、今回はGoogle社製のGSONを使ってみました。コードはこんな感じ。 よく紹介されているレベルのコードと変わりませんが、以下のようなポイントがあります。
  • private  static final の変数に値を突っ込んでいる
  • 内部クラス(staticですが)を利用する
  • 変数名と異なる項目をバインドしている
この辺を気にする人には参考になると思います。
public class GsonBasic {

 public static void main(String[] args) {

  Gson gson = new Gson();
  
  //JSON->POJO(1)
  History his = gson.fromJson(
    new InputStreamReader(GsonBasic.class
      .getResourceAsStream("history.json")), History.class);

  System.out.println("---step1---");
  System.out.println(his);

  //JSON->POJO(1)
  History2 his2 = gson.fromJson(
    new InputStreamReader(GsonBasic.class
      .getResourceAsStream("history.json")), History2.class);

  System.out.println("---step2---");
  System.out.println(his2);

 }

 // 内部クラスにする場合、staticにしないと面倒が起る
 /**
  * 解析結果を受け取るクラス(1)
  */
 static class History {
  // final にすることもできる
  private final int key;
  private final String message;

  // コンストラクタで初期化することで、GSONでもセットできる
  public History() {
   key = 0;
   message = null;
  }

  @Override
  public String toString() {
   StringBuffer sb = new StringBuffer();
   sb.append("key=").append(key);
   sb.append(" message=").append(message);

   return new String(sb);
  }
 }

 /**
  * 解析結果を受け取るクラス(2)
  */
 static class History2 {
  // JSONのキー名と変数名が異なる場合、@SerializedNameを使う
  @SerializedName("key")
  private int mKey = 0;
  @SerializedName("message")
  private String mMessage = "";

  @Override
  public String toString() {
   StringBuffer sb = new StringBuffer();
   sb.append("key=").append(mKey);
   sb.append(" message=").append(mMessage);

   return new String(sb);
  }
 }
}
出力結果は次の通り。
---step1---
key=894 message=遣唐使
---step2---
key=894 message=遣唐使
インプットしたJSONは次の通り。
{
    "key": 894,
    "message": "遣唐使"
}

0 件のコメント :