2010/11/09

slim3を改造して、モデルのJSON変換機能を追加する

Google App Engine for Java用のフレームワークと言えばslim3です。シンプルで非常に使いやすいフレームワークですが、その特徴はアノテーションプロセッサとして実装されている、Metaクラスジェネレータ(slim3-gen)にも当てはまります。拡張性が考慮されていて、簡単に機能を拡張することが出来るようになっていて、実際にアノテーションの情報を元にソースを生成するサンプルも公開されています(リポジトリの、slim3-gen-extention-sample)。

そのサンプルを参考に、slim3-genが生成するメタクラスにjson変換を行うメソッドを追加する拡張、slim3-gen-jsonicを作ってみたので、紹介します。

使い方

  1. slim3-gen-jsonicのバイナリを、ここからダウンロードして下さい(現在最新版はslim3-gen-jsonic-1.0.5.jar)。
  2. 次に、jsonicのバイナリをjsonicのサイトからダウンロードして下さい(現在最新版はjsonic-1.2.4.jar)。
slim3と使う場合と同様にプロジェクトを作成、セットアップし(slim3のスタートガイド参照)、jsonicのjarをビルドパスに追加、slim3-genのjar(現在最新はslim3-gen-1.0.5.jar)の代わりにslim3-gen-jsonicのjarを使用すると、モデルごとに生成されるメタクラスに以下のメソッドが追加されます。
  • public String modelToJson(Object model)
  • public ModelClass jsonToModel(String json)
ModelClassは、各モデルのクラスに置き換わります。

modelToJsonでモデルをJSON文字列に変換し、jsonToModelでその逆、JSON文字列をモデルに変換します。jsonToModelは、内部でJSONICを使っています。使い方は簡単、Metaクラスからこれらのメソッドを呼び出すだけです。

public void test(){
  TestModelMeta m = TestModelMeta.get();
  TestModel model = new TestModel();
  String json = m.modelToJson(model); // model -> JSON
  TestModel model2 = m.jsonToModel(json); // JSON -> model
}

対応している型

現在、以下の型に対応しています。
  • String(cipher=trueの場合、JSON出力時に暗号化されます), List<String>, Set<String>, SortedSet<String>
  • short, Short, List<Short>, Set<Short>, SortedSet<Short>
  • int, Integer, List<Integer>, Set<Integer>, SortedSet<Integer>
  • long, Long, List<Long>, Set<Long>, SortedSet<Long>
  • float, Float, List<Float>, Set<Float>, SortedSet<Float>
  • double, Double, List<Double>, Set<Double>, SortedSet<Double>

ソースからのビルド

EclipseとGoogle Plugin for Eclipse、Subversionクライアント(Subclipse or subversive)が必要です。

まず、slim3のリポジトリから、slim3とslim3-genをチェックアウトします。

次に、slim3-gen-jsonicのリポジトリから、slim3-gen-jsonic、slim3-gen-jsonic-testをチェックアウトします。

slim3-gen-jsonicに含まれているbuild.xmlを使ってビルドすると、slim3-gen-jsonicプロジェクトのtargetディレクトリに、jarファイルが生成されます(slim3-genの全クラスもこのjarに含まれています)。

slim3-gen-jsonic-testプロジェクトは、slim3プロジェクトを参照し、slim3-gen-jsonicプロジェクトが生成するjarをannotation processorとして参照しるので、このプロジェクト内にモデルクラスを作成すると、JSON変換機能を簡単に試せます。また、メタクラスはsrc_generatedディレクトリ内に生成されるようになっているので、実際にどんなメソッドが生成されているか確認できます。

jsonic単体と比べた利点

今のところ持っている機能だと、文字列の暗号化対応以外、jsonicそのものを使っても同じ効果が得られます。slim3-genに統合する形で機能を追加していく利点としては、
  • リフレクションを使わないので速い(但しある程度大きなモデルでも、数十ミリ秒の差でしょう)
  • App Engine固有の型に対応しやすい(固有の型には今後対応していく予定です)
というところが挙げられます。まぁ、あまり大きな利点は無いですし、DatastoreのモデルとJSONとしてクライアントに返すデータのモデルが同じものとも限らない(むしろ別々に設計したほうがよさそう)ですが、Metaを使ってモデルを手軽に変換できるだけでも便利なのではないかと思います。

0 件のコメント: