2013年7月21日日曜日

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

JSONからPOJO(Bean)に変換する処理はめんどくさいです。
Google社製のGSONでは、データ形式にMapとしてバインドすることができます。 残念なことに、Map形式では順序を維持できないという課題があります。
しかしこれはJSONの仕様であり、GSONとしてはその仕様に準じているだけ。といえますね。 

コードはこんな感じ。

public class GsonMap {

    public static void main(String[] args) {
        Gson gson = new Gson();
        // Map.classと書けないので、TypeTokenを使ってTypeを取り出す
        Type type = new TypeToken>() {
        }.getType();

        // JSON->Map
        Map his = gson.fromJson(new InputStreamReader(
                GsonMap.class.getResourceAsStream("history_map.json")), type);

        System.out.println(his);
    }

    /**
     * 解析結果を受け取るクラス
     */
    static class History {
        private int key;
        private String message;

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

            return new String(sb);
        }
    }
}
実行結果はこんな感じ

{
    "kentousi"=["key"=894 "message"="遣唐使"],
    "kamakura1"=["key"=1192 "message"="鎌倉幕府"],
    "kamakura2"=["key"=1185 "message"="鎌倉幕府"]
}
インプットに使ったJSONはこんな感じ

{
    "kentousi": {
        "key": 894,
        "message": "遣唐使"
    },
    "kamakura1": {
        "key": 1192,
        "message": "鎌倉幕府"
    },
    "kamakura2": {
        "key": 1185,
        "message": "鎌倉幕府"
    }
}

0 件のコメント: