4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JSONレスポンスからJSONパーサ用のモデルクラスを生成する

Posted at

JavaでAPIをコールして受け取るとき、Jacksonなどを使うと思いますが、レスポンスを格納するためのJavaオブジェクトはどうやって作成してますか?

短いレスポンスしか返ってこないなら(前書いたTiqavなど)なら手打ちで問題ないですが、大体のAPIだと手打ちではどうしようもない量のパラメータが返ってきます。

そういう時は、レスポンスから自動生成しましょう。

#やり方

JSONのサンプルとして、http://json.org/example.htmlの一番上のJSONを使って、POJOに変換してみます。

jsonschema2pojoというOSSのWebサービス版を使います。

jsonschema2pojoへ移動し、テキストエリアへ生成元のJSONテキストを貼り付けます。

無題.png

そして、Package名をPackageテキストエリアへ、ルートの要素が入るクラスの名前をClass nameへ記述します。

更に、Source TypeをJSON SchemaからJSONへ変更します。すでに何らかの方法でJSONをJSON Schemaに変換しているならそのままでOKです。

無題2.png

次はAnootation Styleを指定します。 使っているライブラリに応じて変更しましょう。(下の画像の緑枠)

自分はJackson2.Xなのでそのままです。

さらにその下のオプション群です。必要に応じてチェックをつけたり外したりしましょう。(下の画像の青枠)

無題2 (1).png

で、最後にZipボタンをクリックすれば、POJO群が生成され、隣にリンクが表示され、そこからダウンロードできます。

無題3.png

#注意点

生成したPOJOですが1つ注意点があります。オプション群でUse long integersにチェックをつけていない限り、数値型(元のJSONでクォーテーションがついていない数値)はすべてIntegerになります。

SNSのAPIから返ってきた投稿idなどでは、桁数が多いため、Integerだとオーバーフローする可能性があります。

上記のとおり、Use long integersにチェックを入れれば回避はできますが、短い桁数の数値でもlong型になってしまうため、Integerで生成してオーバーフローする部分だけlongに変更するほうがいいと思います。

#Androidで使う時

生成したPOJOをAndroidで使うときの注意点

生成したPOJOには、@Generated("org.jsonschema2pojo")というアノテーションが含まれていますが、AndroidのJDKには、Generatedアノテーションが入っているjavax.annotationパッケージが存在しません。

ですので、build.gradleに、Javax.annotation APIを追記することで対処しましょう。

具体的には、build.gradleに、

compile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.2'

を追記します。

4
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?