Java:JacksonをつかってJSONを読み込む
Last-modified: 2013-08-24 (土) 02:14:21 (3753d)
Top / Java:JacksonをつかってJSONを読み込む
Java:JacksonをつかってJSONを読み込む †
JacksonをつかってJSONを読み込むサンプルです。
なんか、JSONを読み込むサンプルを見ると、結構StreamingAPIで読み込んだり、POJOにマッピングしたりが多い気がするんだけど、なんかJSONっぽくない気もしてw
なので、Databindingの「Simple data binding」のサンプルを作って見ました。
準備 †
ここからJarファイルをDLしてクラスパスに追加です。
- JacksonのDLページ
http://wiki.fasterxml.com/JacksonDownload
はじめてのJackson †
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を読み込む †
じゃあ、リストの場合は以下のとおり。
// リスト jsondata = "[1,2]"; List<Integer> result2 = mapper.readValue(jsondata, List.class); System.out.println("result2.toString() : " + result2.toString());
出力はこんな感じ
result2.toString() : [1, 2]
まあ、簡単ですなw
ネストしたリストのJSONを読み込む †
こんな感じです。
// ネストしたリスト 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を読み込む †
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
参考サイト †
- JSON公式サイト?w
http://www.json.org/json-ja.html - Jackson公式サイト
http://jackson.codehaus.org/ - JacksonのDLページ
http://wiki.fasterxml.com/JacksonDownload - JacksonのTutorial
http://wiki.fasterxml.com/JacksonInFiveMinutes - JacksonのDatabindingのページ
http://wiki.fasterxml.com/JacksonDataBinding - Jacksonのjavadoc
http://wiki.fasterxml.com/JacksonJavaDocs
- 技評のJacksonのStreamingAPIの記事
http://gihyo.jp/dev/serial/01/engineer_toolbox/0027
以下、個人メモ : Mapの要素を巡回したい †
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
※個別の値を出力するのは面倒だったので割愛。
SetがIteratorインターフェースを実装しているんだねw