2013年7月21日日曜日

[Java]JSONをJsonObject/JsonArrayにバインドする

JSONからPOJO(Bean)に変換するんだけど、一部分だけJsonObjectに落としたい。そんな時はありませんか?
どんなデータが入ってくるのか決まっていない。けどキーは同じみたいな。結果的に汎用型で受け付けたい。そんなケースです。
いろいろ調べたんだけど方法があわからず。でしたが、実は普通にJsonObjectやJsonArrayつかえば良い。ということがわかりました。 配列の場合だけ気を付けないとダメ。という残念なことになっています。
コードはこんな感じ。


public class GsonObject {
    public static void main(String[] args) {
        Gson gson = new Gson();

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

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

        // JSON->JsonArray(List)JsonArrayじゃないとキャストに失敗する。。。
        JsonArray his2 = gson.fromJson(new InputStreamReader(GsonList.class
                .getResourceAsStream("history_list.json")), JsonArray.class);

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

        // JSON->JsonObject(POJO)
        JsonObject his3 = gson.fromJson(new InputStreamReader(GsonList.class
                .getResourceAsStream("history.json")), JsonObject.class);
        System.out.println("---step3 Object---");
        System.out.println(his3);
    }

    /**
     * 解析結果を受け取るクラス
     */
    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);
        }
    }
}
出力結果はこんな感じ。

---step1 Map---
{"kentousi":{"key":894,"message":"遣唐使"},"kamakura1":{"key":1192,"message":"鎌倉幕府"},"kamakura2":{"key":1185,"message":"鎌倉幕府"}}
---step2 List---
[{"key":894,"message":"遣唐使"},{"key":1192,"message":"鎌倉幕府"},{"key":1185,"message":"鎌倉幕府"}]
---step3 Object---
{"key":894,"message":"遣唐使"}
インプットしたデータは省略。

0 件のコメント: