docs/general/deserialization
Deserialization
This is currently an experimental feature. The interface may change.
JSON API
The ActiveModelSerializers::Deserialization
defines two methods (namely jsonapi_parse
and jsonapi_parse!
), which take a Hash
or an instance of ActionController::Parameters
representing a JSON API payload, and return a hash that can directly be used to create/update models. The bang version throws an InvalidDocument
exception when parsing fails, whereas the “safe” version simply returns an empty hash.
- Parameters
- document:
Hash
orActionController::Parameters
instance - options:
- only:
Array
of whitelisted fields - except:
Array
of blacklisted fields - keys:
Hash
of fields the name of which needs to be modified (e.g.{ :author => :user, :date => :created_at }
)
- document:
Examples:
class PostsController < ActionController::Base def create Post.create(create_params) end def create_params ActiveModelSerializers::Deserialization.jsonapi_parse(params, only: [:title, :content, :author]) end end
Given a JSON API document,
document = { 'data' => { 'id' => 1, 'type' => 'post', 'attributes' => { 'title' => 'Title 1', 'date' => '2015-12-20' }, 'relationships' => { 'author' => { 'data' => { 'type' => 'user', 'id' => '2' } }, 'second_author' => { 'data' => nil }, 'comments' => { 'data' => [{ 'type' => 'comment', 'id' => '3' },{ 'type' => 'comment', 'id' => '4' }] } } } }
The entire document can be parsed without specifying any options:
ActiveModelSerializers::Deserialization.jsonapi_parse(document) #=> # { # title: 'Title 1', # date: '2015-12-20', # author_id: 2, # second_author_id: nil # comment_ids: [3, 4] # }
and fields, relationships, and polymorphic relationships can be specified via the options:
ActiveModelSerializers::Deserialization .jsonapi_parse(document, only: [:title, :date, :author], keys: { date: :published_at }, polymorphic: [:author]) #=> # { # title: 'Title 1', # published_at: '2015-12-20', # author_id: '2', # author_type: 'user' # }
Attributes/Json
There is currently no deserialization for those adapters.