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<String, History>.classと書けないので、TypeTokenを使ってTypeを取り出す
  Type type = new TypeToken<Map<String, History>>() {}.getType();

  // JSON->Map<String,POJO>
  Map<String, History> 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 件のコメント :