RailsでJSON APIを実装する時、JSONライブラリ選定まとめ
はじめに
Webベースで動いているRailsアプリに、スマホアプリ用のAPIを追加することになった。APIはRESTで作成し、JSONでレスポンスを返すのだが、JSONをどう作るのが手軽でコードの保守性が高くできるのか、いいgemがあるなら使いたいと調査した結果です。
最初に結論
- これを使っておけばOKという鉄板gemはない
- メリット、デメリットを考えて自分で選択する必要がある
まずはこれを読むと理解が深まる
RailsにおけるJSON APIの実装方法の変遷が分かる良記事。しかし、最後まで読んでも、JSONを生成するgemは結局どれがいいのかまでは書かれていない。前後リンクの記事も良記事なので合わせておすすめ。
この記事では、主要なJSONを生成するgem(JSONシリアライザ)が、サンプルコード付きで紹介されている。コードを見て、ざっくりどんな感じかを把握するのに便利。
JSON用のテンプレートを書くタイプ
Jbuilder
何も考えずに、とりあえずJSONを作成したい場合はJbuilderを使えばいいと思う。きちんと継続してメンテナンスされている。
ただ、先の記事によると、パフォーマンスに難があるようだ。
jbuilder は部分テンプレートのレンダリングが異常に遅く、 例えばユーザデータ 200 件を含む JSON を返したいだけで 50ms 以上食われることがザラにあった。
昔のことなので、今はパフォーマンスは改善されているかもしれない。パフォーマンスが気になる方は自分で調べてみることをおすすめする。
僕は後述する「シリアライザクラスを書くタイプ」の方が、コードの保守性が高められると感じたので、そこまで調査していない。
jb
jbuilderのパフォーマンスが気になる方には、jbという選択肢がある。readmeに「Why is Jb fast?」とjbuilderと比較したベンチマークが紹介されている。
シリアライザクラスを書くタイプ
ActiveModelSerializers
ググると、これを使っている記事をたくさん見かける。しかし、2017年あたりで開発のコミット履歴が止まっており、既にメンテナンスされていないようだ。
なるべくメンテナンスが継続されているgemを使いたい。
Blueprinter
そこそこ継続的にメンテナンスされており、機能も豊富で使いやすそう。
Alba
最近、日本人の開発者によって作られたgem。
Why Alba?
Because it's fast, flexible and well-maintained!
型付けなど機能も豊富で、パフォーマンスも良い。そして、well-maintainedと書かれているので開発も継続して頑張ってくれそう。
JSON:APIの仕様に対応したい場合
JSON:APIは、jsonのレスポンスフォーマットの規約。規約に沿うことによって、レスポンスフォーマットについて考える労力が少なくなり、アプリケーションの開発自体に集中できるというもの。ざっくり調べただけなので理解が間違ってるかもしれない。
思想には共感できるものの、レスポンス内容が冗長になりそうで、あまり気乗りしなかったため採用を見送った。
JSON:APIに対応したい場合は、下記のライブラリの使用を検討するといいだろう。
Albaを採用
BlueprinterとAlbaのどちらを使うか考えて、結局、Albaを採用した。パフォーマンスが良いという点と、型付け機能が便利そう、今後の開発継続性に期待してAlbaを選択した。
まだ少ししか使っていないが、いい感じに使えている。この記事を読んだ皆さんがAlbaを使うと、さらに開発継続性が期待できるはずなので、みなさんAlbaを使いましょう(笑)。
終わりに
JSON生成ライブラリを選択するだけで、だいぶ時間がかかってしまったので、これから選定する人の時間節約のために、この記事を書いた。ライブラリ選定の何かのお役に立てれば幸いです。
おまけ
2014年に書かれた本だが、今読んでも参考になる部分が多いので、これからAPIを開発する人には一読をおすすめする。
実際に使ってみて
Discussion