3
0

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 3 years have passed since last update.

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

Last updated at Posted at 2020-10-21

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の仕様に沿った表示形式ということは
一番汎用化しやすいってことですかね。

3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?