2013年8月23日金曜日

[Java]google gsonのはまりポイント

JSONをアノテーションでPOJOにバインディングするgsonは、JSONObjectでパースする原始的な処理?より、はるかに楽ができます。 最初使ったときは感動しましたね。こういうライブライがつかえないプロジェクトでは、同様の処理を実現するためにリフレクションであれして。。。なんていう残念な結末が目に浮かびます。

しかし、そのgsonにも、これはないんじゃない?的な結果になることがいくつかあります。
そのいくつかはこんな感じ。
  1. <T> T Gson#fromJson(String json, Type typeOfT) で第一引数にnull渡すと結果がnull
  2. <T> T Gson#fromJson(String json, Type typeOfT) で第一引数にから文字渡すと結果がnull
  3. <T> T Gson#fromJson(Reader json, Class<T> classOfT) で第一引数がのReaderが即EOFになると結果がnull
そうなんです。解析できない系のインプットが入ると、結果がnullになっちゃうんです。
1は、妥当だと思いますが、2,3は例外はくかデフォルトで生成したオブジェクト返せよ!って感じがします。
ということで結果のnullチェックが必要になるという残念な感じになっています。
これ気に入らないなら、Null Object Supportを使えよって話ですね。しかしこれではインプットがnullだからそうなっているのか、空文字系("")だからそうなるのかわかりません。
個人的な考えでは、前者はバグで後者はデータ不正ですね。


ここまでは気を付けるよの話なんですが、問題は

  • JSON構文エラーの際に発生する構文エラーがRuntime系の例外

です。そうなんです。コンパイラーでのチェックができないという残念な結果になります。
・・・外部からインプットするJSONの構文チェックは当然すべきであり、これがランタイムになるというのはちょっと理解できないです。
みなさん、こういうのってどうしてるんでしょうか。