🛤️

RailsでJSON APIを実装する時、JSONライブラリ選定まとめ

2021/10/27に公開

はじめに

Webベースで動いているRailsアプリに、スマホアプリ用のAPIを追加することになった。APIはRESTで作成し、JSONでレスポンスを返すのだが、JSONをどう作るのが手軽でコードの保守性が高くできるのか、いいgemがあるなら使いたいと調査した結果です。

最初に結論

  • これを使っておけばOKという鉄板gemはない
  • メリット、デメリットを考えて自分で選択する必要がある

まずはこれを読むと理解が深まる

https://blog.onk.ninja/2017/09/21/history_of_json_api_with_ruby

RailsにおけるJSON APIの実装方法の変遷が分かる良記事。しかし、最後まで読んでも、JSONを生成するgemは結局どれがいいのかまでは書かれていない。前後リンクの記事も良記事なので合わせておすすめ。

https://shrkw.hatenablog.com/entry/2020/07/16/123000

この記事では、主要なJSONを生成するgem(JSONシリアライザ)が、サンプルコード付きで紹介されている。コードを見て、ざっくりどんな感じかを把握するのに便利。

JSON用のテンプレートを書くタイプ

Jbuilder

https://github.com/rails/jbuilder

何も考えずに、とりあえずJSONを作成したい場合はJbuilderを使えばいいと思う。きちんと継続してメンテナンスされている。

ただ、先の記事によると、パフォーマンスに難があるようだ。

jbuilder は部分テンプレートのレンダリングが異常に遅く、 例えばユーザデータ 200 件を含む JSON を返したいだけで 50ms 以上食われることがザラにあった。

昔のことなので、今はパフォーマンスは改善されているかもしれない。パフォーマンスが気になる方は自分で調べてみることをおすすめする。

僕は後述する「シリアライザクラスを書くタイプ」の方が、コードの保守性が高められると感じたので、そこまで調査していない。

jb

https://github.com/amatsuda/jb

jbuilderのパフォーマンスが気になる方には、jbという選択肢がある。readmeに「Why is Jb fast?」とjbuilderと比較したベンチマークが紹介されている。

シリアライザクラスを書くタイプ

ActiveModelSerializers

https://github.com/rails-api/active_model_serializers

ググると、これを使っている記事をたくさん見かける。しかし、2017年あたりで開発のコミット履歴が止まっており、既にメンテナンスされていないようだ。

なるべくメンテナンスが継続されているgemを使いたい。

Blueprinter

https://github.com/procore/blueprinter

そこそこ継続的にメンテナンスされており、機能も豊富で使いやすそう。

Alba

https://github.com/okuramasafumi/alba

https://zenn.dev/okuramasafumi/articles/53fcee0f946ac3

最近、日本人の開発者によって作られたgem。

Why Alba?
Because it's fast, flexible and well-maintained!

型付けなど機能も豊富で、パフォーマンスも良い。そして、well-maintainedと書かれているので開発も継続して頑張ってくれそう。

JSON:APIの仕様に対応したい場合

https://jsonapi.org/

JSON:APIは、jsonのレスポンスフォーマットの規約。規約に沿うことによって、レスポンスフォーマットについて考える労力が少なくなり、アプリケーションの開発自体に集中できるというもの。ざっくり調べただけなので理解が間違ってるかもしれない。

思想には共感できるものの、レスポンス内容が冗長になりそうで、あまり気乗りしなかったため採用を見送った。

JSON:APIに対応したい場合は、下記のライブラリの使用を検討するといいだろう。

https://jsonapi.org/implementations/#client-libraries-ruby

Albaを採用

BlueprinterとAlbaのどちらを使うか考えて、結局、Albaを採用した。パフォーマンスが良いという点と、型付け機能が便利そう、今後の開発継続性に期待してAlbaを選択した。

まだ少ししか使っていないが、いい感じに使えている。この記事を読んだ皆さんがAlbaを使うと、さらに開発継続性が期待できるはずなので、みなさんAlbaを使いましょう(笑)。

終わりに

JSON生成ライブラリを選択するだけで、だいぶ時間がかかってしまったので、これから選定する人の時間節約のために、この記事を書いた。ライブラリ選定の何かのお役に立てれば幸いです。

おまけ

2014年に書かれた本だが、今読んでも参考になる部分が多いので、これからAPIを開発する人には一読をおすすめする。

https://amzn.to/3ElML4o

実際に使ってみて

https://zenn.dev/imaginelab/articles/91cd220c3c2565

Discussion