RailsのJSONレスポンスの表示形式についてまとめました

プログラム

JOSNレスポンスの表示形式についてよくわかってなくて
はまったので整理しました。

ActiveModelSerializerには、アダプター(JSONの表示形式)を3種類ある。

  • :attributes (default)
  • :json
  • :json_api

attributes:デフォルトで設定されているアダプタ。ルートキーなしでjsonレスポンスを生成する。
json:レスポンスは常にルートキーありでjsonレスポンスを生成する
json_api:JSONAPIという、JSONの仕様を決めている組織が制定している表示形式に沿ったレスポンスが返ってくる

:jsonと:json_apiをデフォルトで使いたい場合には、initializersディレクトリに
別途active_model_serializers.rbというような(名前はなんでもOK)ファイルを作成し、
そこに以下のようにJSONの表示形式を設定する。

# config/initializers/active_model_serializers.rb
ActiveModel::Serializer.config.adapter = :json_api

実際のレスポンスは以下の感じになります

attributes

[
 {"id"=>69,
  "title"=>"鍋",
  "updated_at"=>"2020-10-20T20:52:09.044Z",
  "user"=>
   {"id"=>3,
    "name"=>"xu6i65h83tbvexx5dld89w39xn4u9",
    "email"=>"3_ahmad@smith-brekke.biz"}
 }
]

json

"articles"がルートキーになります。
ルートキー名はcontroller名を取得しています。

{"articles"=>
  [
    {"id"=>72,
     "title"=>"あらそう",
     "updated_at"=>"2020-10-20T20:58:15.458Z",
     "user"=>
      {"id"=>3,
       "name"=>"e8zu6a5m08jlgd3w1ddlxkoa",
       "email"=>"3_ernest_denesik@deckow-gutkowski.com"}
    },
  ]
}

json_api

{"data"=>
  [
    {"id"=>"66",
     "type"=>"articles",
     "attributes"=>{"title"=>"ひんきゃく", "updated-at"=>"2020-10-20T20:44:16.765Z"},
    "relationships"=>
     {"user"=>
      {"data"=>
       {"id"=>"3", 
        "type"=>"users"}
       }
      }
     }
  ]
}

だんだん構造化されていってる感じですね。
json_apiがJSONの仕様に沿った表示形式ということは
一番汎用化しやすいってことですかね。