DS.JSONSerializer Class packages/ember-data/lib/serializers/json_serializer.js:11
Defined in: packages/ember-data/lib/serializers/json_serializer.js:11
Module: ember-data
In Ember Data a Serializer is used to serialize and deserialize records when they are transfered in and out of an external source. This process involves normalizing property names, transforming attribute values and serializeing relationships.
For maximum performance Ember Data recomends you use the RESTSerializer or one of its subclasses.
JSONSerializer
is useful for simpler or legacy backends that may
not support the http://jsonapi.org/ spec.
Methods
- applyTransforms
- extract
- extractArray
- extractCreateRecord
- extractDeleteRecord
- extractFind
- extractFindAll
- extractFindBelongsTo
- extractFindHasMany
- extractFindMany
- extractFindQuery
- extractMeta
- extractSave
- extractSingle
- extractUpdateRecord
- keyForRelationship
- normalize
- serialize
- serializeAttribute
- serializeBelongsTo
- serializeHasMany
- serializePolymorphicType
- transformFor
Properties
applyTransforms
(type, data)
Object
private
Given a subclass of DS.Model
and a JSON object this method will
iterate through each attribute of the DS.Model
and invoke the
DS.Transform#deserialize
method on the matching property of the
JSON object. This method is typically called after the
serializer's normalize
method.
Parameters:
- type subclass of DS.Model
- data Object
- The data to transform
Returns:
- Object
- data The transformed data object
extract
(store, type, payload, id, requestType)
Object
The extract
method is used to deserialize payload data from the
server. By default the JSONSerializer
does not push the records
into the store. However records that subclass JSONSerializer
such as the RESTSerializer
may push records into the store as
part of the extract call.
This method deletegates to a more specific extract method based on
the requestType
.
Example
1 2 3 4 5 6 7 8 9 |
var get = Ember.get; socket.on('message', function(message) { var modelName = message.model; var data = message.data; var type = store.modelFor(modelName); var serializer = store.serializerFor(type.typeKey); var record = serializer.extract(store, type, data, get(data, 'id'), 'single'); store.push(modelName, record); }); |
Parameters:
Returns:
- Object
- json The deserialized payload
extractArray
(store, type, payload)
Array
extractArray
is used to deserialize an array of records
returned from the adapter.
Example
1 2 3 4 5 6 7 |
App.PostSerializer = DS.JSONSerializer.extend({ extractArray: function(store, type, payload) { return payload.map(function(json) { return this.extractSingle(json); }, this); } }); |
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Array
- array An array of deserialized objects
extractCreateRecord
(store, type, payload)
Object
extractCreateRecord
is a hook into the extract method used when a
call is made to DS.Store#createRecord
. By default this method is
alias for extractSave.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Object
- json The deserialized payload
extractDeleteRecord
(store, type, payload)
Object
extractDeleteRecord
is a hook into the extract method used when
a call is made to DS.Store#deleteRecord
. By default this method is
alias for extractSave.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Object
- json The deserialized payload
extractFind
(store, type, payload)
Object
extractFind
is a hook into the extract method used when
a call is made to DS.Store#find
. By default this method is
alias for extractSingle.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Object
- json The deserialized payload
extractFindAll
(store, type, payload)
Array
extractFindAll
is a hook into the extract method used when a
call is made to DS.Store#findAll
. By default this method is an
alias for extractArray.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Array
- array An array of deserialized objects
extractFindBelongsTo
(store, type, payload)
Object
extractFindBelongsTo
is a hook into the extract method used when
a call is made to DS.Store#findBelongsTo
. By default this method is
alias for extractSingle.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Object
- json The deserialized payload
extractFindHasMany
(store, type, payload)
Array
extractFindHasMany
is a hook into the extract method used when a
call is made to DS.Store#findHasMany
. By default this method is
alias for extractArray.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Array
- array An array of deserialized objects
extractFindMany
(store, type, payload)
Array
extractFindMany
is a hook into the extract method used when a
call is made to DS.Store#findMany
. By default this method is
alias for extractArray.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Array
- array An array of deserialized objects
extractFindQuery
(store, type, payload)
Array
extractFindQuery
is a hook into the extract method used when a
call is made to DS.Store#findQuery
. By default this method is an
alias for extractArray.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Array
- array An array of deserialized objects
extractMeta
(store, type, payload)
extractMeta
is used to deserialize any meta information in the
adapter payload. By default Ember Data expects meta information to
be located on the meta
property of the payload object.
Example
1 2 3 4 5 6 7 8 |
App.PostSerializer = DS.JSONSerializer.extend({ extractMeta: function(store, type, payload) { if (payload && payload._pagination) { store.metaForType(type, payload._pagination); delete payload._pagination; } } }); |
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
extractSave
(store, type, payload)
Object
extractSave
is a hook into the extract method used when a call
is made to DS.Model#save
. By default this method is alias
for extractSingle.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Object
- json The deserialized payload
extractSingle
(store, type, payload)
Object
extractSingle
is used to deserialize a single record returned
from the adapter.
Example
1 2 3 4 5 6 7 8 |
App.PostSerializer = DS.JSONSerializer.extend({ extractSingle: function(store, type, payload) { payload.comments = payload._embedded.comment; delete payload._embedded; return this._super(store, type, payload); }, }); |
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Object
- json The deserialized payload
extractUpdateRecord
(store, type, payload)
Object
extractUpdateRecord
is a hook into the extract method used when
a call is made to DS.Store#update
. By default this method is alias
for extractSave.
Parameters:
- store DS.Store
- type subclass of DS.Model
- payload Object
Returns:
- Object
- json The deserialized payload
keyForRelationship
(key, relationship)
String
keyForRelationship
can be used to define a custom key when
serializeing relationship properties. By default JSONSerializer
does not provide an implementation of this method.
Example
1 2 3 4 5 |
App.PostSerializer = DS.JSONSerializer.extend({ keyForRelationship: function(key, relationship) { return 'rel_' + Ember.String.underscore(key); } }); |
Returns:
- String
- normalized key
normalize
(type, hash)
Object
Normalizes a part of the JSON payload returned by the server. You should override this method, munge the hash and call super if you have generic normalization to do.
It takes the type of the record that is being normalized (as a DS.Model class), the property where the hash was originally found, and the hash to normalize.
You can use this method, for example, to normalize underscored keys to camelized or other general-purpose normalizations.
Example
1 2 3 4 5 6 7 8 9 10 11 |
App.ApplicationSerializer = DS.JSONSerializer.extend({ normalize: function(type, hash) { var normalizedHash = {}; var fields = Ember.get(type, 'fields'); fields.forEach(function(field) { var normalizedProp = Ember.String.camelize(field); normalizedHash[normalizedProp] = hash[field]; }); return this._super.apply(this, arguments); } }); |
Parameters:
- type subclass of DS.Model
- hash Object
Returns:
- Object
serialize
(record, options)
Object
Called when a record is saved in order to convert the record into JSON.
By default, it creates a JSON object with a key for each attribute and belongsTo relationship.
For example, consider this model:
1 2 3 4 5 6 |
App.Comment = DS.Model.extend({ title: DS.attr(), body: DS.attr(), author: DS.belongsTo('user') }); |
The default serialization would create a JSON object like:
1 2 3 4 5 |
{ "title": "Rails is unagi", "body": "Rails? Omakase? O_O", "author": 12 } |
By default, attributes are passed through as-is, unless
you specified an attribute type (DS.attr('date')
). If
you specify a transform, the JavaScript value will be
serialized when inserted into the JSON hash.
By default, belongs-to relationships are converted into IDs when inserted into the JSON hash.
IDs
serialize
takes an options hash with a single option:
includeId
. If this option is true
, serialize
will,
by default include the ID in the JSON object it builds.
The adapter passes in includeId: true
when serializing
a record for createRecord
, but not for updateRecord
.
Customization
Your server may expect a different JSON format than the built-in serialization format.
In that case, you can implement serialize
yourself and
return a JSON hash of your choosing.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
App.PostSerializer = DS.JSONSerializer.extend({ serialize: function(post, options) { var json = { POST_TTL: post.get('title'), POST_BDY: post.get('body'), POST_CMS: post.get('comments').mapProperty('id') } if (options.includeId) { json.POST_ID_ = post.get('id'); } return json; } }); |
Customizing an App-Wide Serializer
If you want to define a serializer for your entire
application, you'll probably want to use eachAttribute
and eachRelationship
on the record.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
App.ApplicationSerializer = DS.JSONSerializer.extend({ serialize: function(record, options) { var json = {}; record.eachAttribute(function(name) { json[serverAttributeName(name)] = record.get(name); }) record.eachRelationship(function(name, relationship) { if (relationship.kind === 'hasMany') { json[serverHasManyName(name)] = record.get(name).mapBy('id'); } }); if (options.includeId) { json.ID_ = record.get('id'); } return json; } }); function serverAttributeName(attribute) { return attribute.underscore().toUpperCase(); } function serverHasManyName(name) { return serverAttributeName(name.singularize()) + "_IDS"; } |
This serializer will generate JSON that looks like this:
1 2 3 4 5 |
{ "TITLE": "Rails is omakase", "BODY": "Yep. Omakase.", "COMMENT_IDS": [ 1, 2, 3 ] } |
Tweaking the Default JSON
If you just want to do some small tweaks on the default JSON, you can call super first and make the tweaks on the returned JSON.
1 2 3 4 5 6 7 8 9 10 |
App.PostSerializer = DS.JSONSerializer.extend({ serialize: function(record, options) { var json = this._super.apply(this, arguments); json.subject = json.title; delete json.title; return json; } }); |
Parameters:
- record subclass of DS.Model
- options Object
Returns:
- Object
- json
serializeAttribute
(record, json, key, attribute)
serializeAttribute
can be used to customize how DS.attr
properties are serialized
For example if you wanted to ensure all you attributes were always
serialized as properties on an attributes
object you could
write:
1 2 3 4 5 6 |
App.ApplicationSerializer = DS.JSONSerializer.extend({ serializeAttribute: function(record, json, key, attributes) { json.attributes = json.attributes || {}; this._super(record, json.attributes, key, attributes); } }); |
serializeBelongsTo
(record, json, relationship)
serializeBelongsTo
can be used to customize how DS.belongsTo
properties are serialized.
Example
1 2 3 4 5 6 7 8 9 10 11 |
App.PostSerializer = DS.JSONSerializer.extend({ serializeBelongsTo: function(record, json, relationship) { var key = relationship.key; var belongsTo = get(record, key); key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo") : key; json[key] = Ember.isNone(belongsTo) ? belongsTo : belongsTo.toJSON(); } }); |
Parameters:
- record DS.Model
- json Object
- relationship Object
serializeHasMany
(record, json, relationship)
serializeHasMany
can be used to customize how DS.hasMany
properties are serialized.
Example
1 2 3 4 5 6 7 8 9 10 |
App.PostSerializer = DS.JSONSerializer.extend({ serializeHasMany: function(record, json, relationship) { var key = relationship.key; if (key === 'comments') { return; } else { this._super.apply(this, arguments); } } }); |
Parameters:
- record DS.Model
- json Object
- relationship Object
serializePolymorphicType
(record, json, relationship)
You can use this method to customize how polymorphic objects are
serialized. Objects are considered to be polymorphic if
{polymorphic: true}
is pass as the second argument to the
DS.belongsTo
function.
Example
1 2 3 4 5 6 7 8 |
App.CommentSerializer = DS.JSONSerializer.extend({ serializePolymorphicType: function(record, json, relationship) { var key = relationship.key, belongsTo = get(record, key); key = this.keyForAttribute ? this.keyForAttribute(key) : key; json[key + "_type"] = belongsTo.constructor.typeKey; } }); |
Parameters:
- record DS.Model
- json Object
- relationship Object
transformFor
(attributeType, skipAssertion)
DS.Transform
private
Parameters:
- attributeType String
- skipAssertion Boolean
Returns:
- DS.Transform
- transform
primaryKey
{String}
The primaryKey is used when serializing and deserializing
data. Ember Data always uses the id
propery to store the id of
the record. The external source may not always follow this
convention. In these cases it is usesful to override the
primaryKey property to match the primaryKey of your external
store.
Example
1 2 3 |
App.ApplicationSerializer = DS.JSONSerializer.extend({ primaryKey: '_id' }); |