トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Java:JacksonをつかってJSONを読み込む のバックアップの現在との差分(No.1)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
*Java:JacksonをつかってJSONを読み込む [#rdc759dc]

JacksonをつかってJSONを読み込むサンプルです。

なんか、JSONを読み込むサンプルを見ると、結構StreamingAPIで読み込んだり、POJOにマッピングしたりが多い気がするんだけど、なんかJSONっぽくない気もしてw

なので、Databindingの「Simple data binding」のサンプルを作って見ました。

***準備 [#y6dcb9ad]
ここからJarファイルをDLしてクラスパスに追加です。

-JacksonのDLページ&br;http://wiki.fasterxml.com/JacksonDownload

***はじめてのJackson [#vaaacd4b]
Jacksonの「Simple data binding」は簡単です。

基本的にはこれだけ。

 // Jacksonのマッパーを生成。
 ObjectMapper mapper = new ObjectMapper();
 
 // JSON(オブジェクト)
 String jsondata = "{\"a\":1,\"b\":2}";
 Map<String,Integer> result = mapper.readValue(jsondata, Map.class);
 System.out.println("result1.toString() : " + result.toString());

出力はこんな感じ。
 result1.toString() : {a=1, b=2}

使い方としては、大体のJSONの第一階層はMap型にマップできるので、上のような感じになる。


***リストで始まるJSONを読み込む [#f475ba6a]
じゃあ、リストの場合は以下のとおり。
 // リスト
 jsondata = "[1,2]";
 List<Integer> result2 = mapper.readValue(jsondata, List.class);
 System.out.println("result2.toString() : " + result2.toString());

出力はこんな感じ
 result2.toString() : [1, 2]

まあ、簡単ですなw

***ネストしたリストのJSONを読み込む [#w981d1e3]
こんな感じです。
 // ネストしたリスト
 jsondata = "[[\"1111\",\"aaaa\"],[\"2222\",\"bbbb\"]]";
 List<List<String>> result3 = mapper.readValue(jsondata, List.class);
 System.out.println("result3.toString() : " + result3.toString());

3行目がちょっと入れ子になりました。

出力はこんな感じ
 result3.toString() : [[1111, aaaa], [2222, bbbb]]

***マップにリストがネストしたJSONを読み込む [#ec21da2e]
JSONだんだん構造が複雑になってきました。
 // オブジェクトの中にリストが含まれているパターン
 jsondata = "{\"a\":1,\"b\":2,\"c\":[\"xxxx\",\"yyyy\"]}";
 Map<String,Object> result4 = mapper.readValue(jsondata, Map.class);
 System.out.println("result4.toString() : " + result4.toString());
 System.out.println("result4.a    : " + result4.get("a").getClass() +":"+result4.get("a"));
 System.out.println("result4.b    : " + result4.get("b").getClass() +":"+result4.get("b"));
 System.out.println("result4.c[0] : " + result4.get("c").getClass() +":"+result4.get("c"));
 System.out.println("result4.c[1] : " + ((List)result4.get("c")).get(0).getClass() +":"+((List)result4.get("c")).get(0));
 System.out.println("result4.c : " + ((List)result4.get("c")).get(1).getClass() +":"+((List)result4.get("c")).get(1));

出力はこんな感じ
 result4.a    : class java.lang.Integer:1
 result4.b    : class java.lang.Integer:2
 result4.c[0] : class java.util.ArrayList:[xxxx, yyyy]
 result4.c[1] : class java.lang.String:xxxx
 result4.c : class java.lang.String:yyyy

これよりも複雑なJSONを読み込むようであれば、再帰処理でMapかListか判別してデータにアクセスするようなコードが必要となる気がするので、データ構造が複雑な場合はPOJOにマッピングしたりするんだねーw

***参考サイト [#pfa0eff6]
-JSON公式サイト?w&br;http://www.json.org/json-ja.html
-Jackson公式サイト&br;http://jackson.codehaus.org/
-JacksonのDLページ&br;http://wiki.fasterxml.com/JacksonDownload
-JacksonのTutorial&br;http://wiki.fasterxml.com/JacksonInFiveMinutes
-JacksonのDatabindingのページ&br;http://wiki.fasterxml.com/JacksonDataBinding
-Jacksonのjavadoc&br;http://wiki.fasterxml.com/JacksonJavaDocs

-技評のJacksonのStreamingAPIの記事&br;http://gihyo.jp/dev/serial/01/engineer_toolbox/0027

***以下、個人メモ : Mapの要素を巡回したい [#ja1c39a9]
Mapの要素を巡回したい場合。

keySet()メソッドでキーのセットがとれて、これが拡張forループに喰わせられる。

 jsondata = "{\"a\":1,\"b\":2,\"c\":[\"xxxx\",\"yyyy\"],\"d\":{\"d1\":\"eeeee\",\"d2\":\"fffff\"}}";
 Map<String,Object> result5 = mapper.readValue(jsondata, Map.class);
 for (String key : result5.keySet()){
 	if (result5.get(key) instanceof Map) {
 		System.out.println("result4.get(\""+key+"\") instanceof Map");
 	}else if (result5.get(key) instanceof List){
 		System.out.println("result4.get(\""+key+"\") instanceof List");;
 	}	
 }

出力はこんな感じ。
 result4.get("c") instanceof List
 result4.get("d") instanceof Map
※個別の値を出力するのは面倒だったので割愛。

-http://docs.oracle.com/javase/jp/6/api/
-http://docs.oracle.com/javase/jp/6/api/java/util/Set.html

SetがIteratorインターフェースを実装しているんだねw