jbuilder/rabl/Active Model Seriarizer Rails 4のjsonライブラリについてin Ginza.rb

10/26に開催されたginza.rb「Ginza.rb 第4回 Rails 4.0時代の json ライブラリ頂上決定戦!!」のレポート記事です。

今回は、Rails 4で有名どころのjsonライブラリ、jbuilder、rabl、Activemodel Seriarizerを比較してその特徴を考えていくのがテーマでした。参加して、jsonのライブラリにもそれぞれ設計に思想の違いがあって、その特徴の違いを意識して、ライブラリを選択するべきだと実感できました^^

ちなみに、次回は11/26(火)に「Ginza.rb 第5回 ハラショー! Russian Doll Caching!」がもしご興味があればぜひ!


🗽 jbuilder

jbuilderはJSONレスポンスを出力するテンプレートエンジンです。Rails 4のbundle installでデフォルトでインストールされます。

jbuilderの一番簡単な使い方のイメージは/app/views/articles/show.json.jbuilder内でこんな風に使います。

json.id @article.id
json.name @article.name

これで、http://localhost/articles/1.jsonでアクセスするとjsonを出力してくれます。
jbuilderはviewなどに書くことも可能で、DSLもRubyらしくて読みやすいです。

特徴は次のとおり。

* Viewでき術できる。部分テンプレートなども使える
* Rails インテグレーションが優れている
* キャッシュにも対応している

jbuiderに関するリンクはこちら。

rails/jbuilder · GitHub

#320 Jbuilder - RailsCasts

👽 rabl

rablはRuby API Builder Languageの略で、jbuilderなどに比べて機能も豊富です。json、xml、MessagePack、PList、BSONなどに対応しています。

rablの簡単な例は、/app/views/articles/show.json.rablで次のように書くとjsonを出力してくれます。

object @article
attributes :id, :name, :published_at

少しだけ書き方にクセがありますが、覚えてしまえば書きやすそうです。

rablの特徴は次のとおり。

* 記述量が、jbuilderよりも少ない。
* bson, message_list, xmlなど幅広く対応
* 設定がかなり多いので細かい対応がしやすい

rablに関するリンクはこちら。

nesquena/rabl · GitHub

#322 RABL - RailsCasts

😎 Active Model Serializers

Active Model Serializersは、Active Modelをシリアライズするためのライブラリで、jsonに対応しています。

Active Model Serializersの簡単な使い方としては、/app/serializers/article_serializer.rbに次のように書きます。

class ArticleSerializer < ActiveModel::Serializer
attributes :id, :name, :content
end

jbuilderやrablと違って、専用のクラスを作るところが特徴的です。

* コントローラに記述しないといけないので気持ち悪い
* rails g serializer も提供されている
* キャッシュにも対応、継承もできてオブジェクト思考的

Active Model::Serializerにかんするリンクはこちら!

#409 Active Model Serializers - RailsCasts

active_model_serializersを試してみた

🗻 パフォーマンス比較

簡単なABテストを会場で行いました。その際のパフォーマンスはserializer/jbuilderが同じくらい、rablは2倍くらいの時間がかかるっぽかったです。

ちなみにABコマンドの説明はこちら。

Abコマンドを使ったウェブアプリケーションのパフォーマンス計測

😸 考察

それぞれのライブラリは得手不得手や、設計上の思想の違いがあり、一概にコレが一番というわけではなさそうです。各ライブラリの特徴を意識しつつ、ぜひ試してみてください!

📚 おすすめの書籍

💩 欲しいものリスト公開しました