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