*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