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 件のコメント: