Java:JacksonをつかってJSONを読み込む の変更点
Top / Java:JacksonをつかってJSONを読み込む
- 追加された行はこの色です。
- 削除された行はこの色です。
- Java:JacksonをつかってJSONを読み込む へ行く。
- Java:JacksonをつかってJSONを読み込む の差分を削除
*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