トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Java:JacksonをつかってJSONを読み込む

Last-modified: 2013-08-24 (土) 02:14:21 (3387d)
Top / Java:JacksonをつかってJSONを読み込む

Java:JacksonをつかってJSONを読み込む

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

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

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

準備

ここからJarファイルをDLしてクラスパスに追加です。

はじめての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

参考サイト

以下、個人メモ : 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