JsonPullParser 0.1 とりあえずリリース

APTやばくね? - @vvakame の日記 で書いてたJsonPullParserをリリースしてみます。
https://github.com/vvakame/JsonPullParser

JsonPullParserは @zaki50 さんがコード見てくれたり書いてくれたりしてくれています!ありがとーざきさん!!

今回リリースする v0.1では以下の事ができます。

JSONの逐次解釈

XmlPullParser のように、JSONの先頭から少しずつパースし処理していくことが出来ます。
例えばTwitterからTimeLineを50件分取得したとき、Android標準 のやり方だと、全体を解釈してからでないと表示などの処理を行うことができません。
JsonPullParserでは先頭から順番にパースし、パースした分から先行して処理を行うことができるので、1件目をパースした時点でとりあえず表示することが出来るので、ユーザの待ち時間を少なくする事が出来ます。
ただ、これだけでそのまま使うことはないでしょう。めんどいから。

サンプルコード
JSONの逐次解釈

JSONのデシリアライズ

JsonPullParser単体では死ぬほど使いづらいです。(XmlPullParser使う時のめんどくささを思い出してください!)
なんで、JSONObjectやJSONArrayのように扱いやすいラッパを用意しました。
ただし、この方法では逐次解釈の良さ、"読めたとこから処理できる!"が失われてしまうので注意してください。
あくまでコーディングの手間を減らしサクッ!っと書くためのツールです。

サンプルコード
JsonHash
JsonArray

JSONのデシリアライズ(with POJOマッピング)

上記デシリアライズはお手軽ですが、ベストチョイスかというとちょっと足りない感じ…!
だってねぇ、逐次処理が出来ないし、静的言語の嬉しさである型安全さが足りないですよ…!
こういう感じPOJOアノテーションを付けておくと、JSONからPOJOに変換してくれるユーティリティクラスが生成されます。
JsonKeyアノテーションを付けることが出来るフィールドの型は

  • primitiveな型(int, boolean, etc)
  • String
  • 他のJsonModelアノテーションで修飾されているクラス
  • JsonHash
  • JsonArray
  • List (Genericで指定されている型が上記のいずれか)

のみとなっています。

使用例
こちらは逐次処理に対応していて、OnJsonObjectAddListenerを介して、組み立て終わったオブジェクトを都度受け取る事が出来ます。AsyncTaskと組み合わせて使う例を見るとどういう感じになるかほんのりわかるかと。

ダウンロード

sample Android apk
jar archive

使い方

サンプルAndroid apkの方はTwitterのPublicTimelineをParseし逐次表示を行うサンプルです。

jar archiveの方はjar4つをzipで固めてあります。
実行時に必要なのは jsonpullparser-core-0.1.jar だけです。
AndroidProjectではlibsに入れるのはこれだけで良いです。BuildPathに追加するのもこれだけでいいです。
jsonpullparser-apt-0.1.jar はコンパイル時に必要で、ソース生成をしてくれるライブラリです。

Eclipseのプロジェクトの設定でJava Compiler→Annotation Processing→Factiory Pathから指定します。
デフォルトの生成クラス名はHoge.javaの場合はHogeGen.javaですが Annotation Processingの設定で変更することができます。

JsonPullParserClassPostFixでSlim3風に"Meta"にするとか、なんかカッコいいからと"SuperHyperHelper"とかにするのもいいでしょう。
また、生成されたソースの出力先も設定できるので、AndroidProjectの場合は"gen"とかに変更しておくといいと思います。

てきとうベンチマーク

ベンチマークとってみた。
6000個のTweetをパースします。僕のMacMiniだと、それぞれ

  • JsonPullParser (to POJO)
    • 1220 millisecond
  • JsonPullParser (to JsonArray)
    • 2051 millisecond
  • JSONIC (to POJO)
    • 5040 millisecond
  • json-lib (to JSONArray)
    • 3835 millisecond

という感じで割と早いです。Androidだとどぉなんだろう…。
POJOマッピングの際、Stringはswitchで使えないから全部if文になってて遅そうな感じがするのですがそれでも勝ってます。

今後の予定

  • Velocityを使ってコード生成部を分かりやすくできないか検討する
  • 生成されるヘルパークラスのコードをもっと最適化する
    • String switchさえあれば話は楽なのにぐぬぬ

ただし、今回リリース分が結構需要あってやる気が出たりしない限りほっとくかもしんない! :)

お願い

  • バグを見つけたら教えてください
    • 出来たらパッチもください
    • バグってるパターンがテスト出来るテストコードを送ってくれるのでも相当嬉しいです
  • 要望があったら教えてください
    • @vvakame までよろしくね!
  • 改善パッチとかも待ってます
    • 特に、pom.xmlの改善とBenchmarkの追加コードとかすごい嬉しいです
  • JsonPullParserを利用したプロダクトをリリースした場合教えてほしいです
    • 調子にのってアップデートを頑張り始めたりするかもしれません
  • 英語リソースに置き換えたい…かも?
    • 日本国外勢にも関心を持ってもらえると嬉しい…かなぁ。多分。

ライセンス

あまり深く気にしていないので Apache License 2.0 にしときます。