androidでJSONを扱うのが意外に面倒な件

2013-09-03

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なのかなあ。