androidでJSONを扱う機会があり(昨今のAPIはJSON形式のものが圧倒的に多いのでJSONを扱う機会は私に限らず多いと思うのですが)、
JSONをオブジェクトにパースするライブラリについて調べてみました。
1. android.util.JsonReader
実は、JsonReaderクラスがandrodの標準APIに存在します。
http://developer.android.com/reference/android/util/JsonReader.html
- example
reader.beginObject(); while (reader.hasNext()) { String name = reader.nextName(); if (name.equals("id")) { id = reader.nextLong(); } else if (name.equals("text")) { text = reader.nextString(); } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) { geo = readDoublesArray(reader); } else if (name.equals("user")) { user = readUser(reader); } else { reader.skipValue(); } }
はっきりいってありえません。
2. json-lib
シンプルにJSONを扱えるライブラリのjson-libです。
http://json-lib.sourceforge.net/
下記モジュールに依存します。
- jakarta commons-lang 2.4
- jakarta commons-beanutils 1.7.0
- jakarta commons-collections 3.2
- jakarta commons-logging 1.1.1
- ezmorph 1.0.6
commonsのそんなに大きくないライブラリとはいえ、androidでロードするライブラリが増えるのはあまり好ましくありません。
- example
JSONObject jsonObject = JSONObject.fromObject("{\"id\":12,\"name\":\"Thom\"}"); Bean bean = (Bean)JSONObject.toBean( jsonObject, Bean.class ); System.out.println(bean.getId() + " " + bean.getName() );
3. Jackson
サーバサイドJavaでよく使われるのは、このJacksonではないでしょうか。
※ JBoss, Seam系ライブラリで使われているからだと思うのですが・・・
http://jackson.codehaus.org/
- example
ObjectMapper m = new ObjectMapper(); JsonNode rootNode = m.readTree(new File("user.json")); JsonNode nameNode = rootNode.path("name"); String lastName = nameNode.path("last").getTextValue().
悲しいほどめんどくさいです。
4. Gson
Googleが開発しているGsonです。JSRの仕様にも取り込まれるとか取り込まれないとか。
なぜ、androidの標準APIに採用されたのが、こちらではないのでしょう。。
https://code.google.com/p/google-gson/
- example
Gson gson = new Gson(); BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
比較的扱いやすいインターフェイスに思えます。
※Protocol-Buffersに慣れてしまったからかも・・・
★まとめ★
使いやすさで言えばjson-lib、二番手にGsonではないでしょうか。
ライブラリ(依存ライブラリ含む)の大きさを加味すると、Gsonなのかなあ。