Class DS.JSONAPISerializer
Ember Data 2.0 Serializer:
In Ember Data a Serializer is used to serialize and deserialize records when they are transferred in and out of an external source. This process involves normalizing property names, transforming attribute values and serializing relationships.
JSONAPISerializer
supports the http://jsonapi.org/ spec and is the
serializer recommended by Ember Data.
This serializer normalizes a JSON API payload that looks like:
// models/player.js
import DS from "ember-data";
export default DS.Model.extend({
name: DS.attr(),
skill: DS.attr(),
gamesPlayed: DS.attr(),
club: DS.belongsTo('club')
});
// models/club.js
import DS from "ember-data";
export default DS.Model.extend({
name: DS.attr(),
location: DS.attr(),
players: DS.hasMany('player')
});
{
"data": [
{
"attributes": {
"name": "Benfica",
"location": "Portugal"
},
"id": "1",
"relationships": {
"players": {
"data": [
{
"id": "3",
"type": "players"
}
]
}
},
"type": "clubs"
}
],
"included": [
{
"attributes": {
"name": "Eusebio Silva Ferreira",
"skill": "Rocket shot",
"games-played": 431
},
"id": "3",
"relationships": {
"club": {
"data": {
"id": "1",
"type": "clubs"
}
}
},
"type": "players"
}
]
}
to the format that the Ember Data store expects.
extract (store, typeClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1209
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Object
json The deserialized payload
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 delegates to a more specific extract method based on
the requestType
.
To override this method with a custom one, make sure to call
return this._super(store, type, payload, id, requestType)
with your
pre-processed data.
Here's an example of using extract
manually:
socket.on('message', function(message) {
var data = message.data;
var typeClass = store.modelFor(message.modelName);
var serializer = store.serializerFor(typeClass.modelName);
var record = serializer.extract(store, typeClass, data, data.id, 'single');
store.push(message.modelName, record);
});
extractArray (store, typeClass, arrayPayload, id, requestType) Array
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1470
- store
- DS.Store
- typeClass
- DS.Model
- arrayPayload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Array
array An array of deserialized objects
extractArray
is used to deserialize an array of records
returned from the adapter.
Example
import DS from 'ember-data';
export default DS.JSONSerializer.extend({
extractArray: function(store, typeClass, payload) {
return payload.map(function(json) {
return this.extractSingle(store, typeClass, json);
}, this);
}
});
extractAttributes (modelClass, resourceHash) Object
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:189
- modelClass
- DS.Model
- resourceHash
- Object
- returns
- Object
extractCreateRecord (store, typeClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1332
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Object
json The deserialized payload
extractCreateRecord
is a hook into the extract method used when a
call is made to DS.Model#save
and the record is new. By default
this method is alias for extractSave.
extractDeleteRecord (store, typeClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1364
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Object
json The deserialized payload
extractDeleteRecord
is a hook into the extract method used when
a call is made to DS.Model#save
and the record has been deleted.
By default this method is alias for extractSave.
extractErrors (store, typeClass, payload, id) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1548
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- returns
- Object
json The deserialized errors
extractErrors
is used to extract model errors when a call is made
to DS.Model#save
which fails with an InvalidError
. By default
Ember Data expects error information to be located on the errors
property of the payload object.
Example
import DS from 'ember-data';
export default DS.JSONSerializer.extend({
extractErrors: function(store, typeClass, payload, id) {
if (payload && typeof payload === 'object' && payload._problems) {
payload = payload._problems;
this.normalizeErrors(typeClass, payload);
}
return payload;
}
});
extractFind (store, typeClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1381
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Object
json The deserialized payload
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.
extractFindAll (store, typeClass, payload, id, requestType) Array
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1251
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Array
array An array of deserialized objects
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.
extractFindBelongsTo (store, typeClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1398
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Object
json The deserialized payload
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.
extractFindHasMany (store, typeClass, payload, id, requestType) Array
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1315
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Array
array An array of deserialized objects
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.
extractFindMany (store, typeClass, payload, id, requestType) Array
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1299
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Array
array An array of deserialized objects
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.
extractFindQuery (store, typeClass, payload, id, requestType) Array
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1267
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Array
array An array of deserialized objects
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.
extractId (modelClass, resourceHash) String
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:513
- modelClass
- Object
- resourceHash
- Object
- returns
- String
Returns the resource's ID.
extractMeta (store, typeClass, payload)
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1512
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
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
import DS from 'ember-data';
export default DS.JSONSerializer.extend({
extractMeta: function(store, typeClass, payload) {
if (payload && payload._pagination) {
store.setMetadataFor(typeClass, payload._pagination);
delete payload._pagination;
}
}
});
extractQueryRecord (store, typeClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1283
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Object
object A hash of deserialized object
extractQueryRecord
is a hook into the extract method used when a
call is made to DS.Store#queryRecord
. By default this method is an
alias for extractSingle.
extractRelationship (relationshipHash) Object
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:210
- relationshipHash
- Object
- returns
- Object
extractRelationships (modelClass, resourceHash) Object
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:228
- modelClass
- Object
- resourceHash
- Object
- returns
- Object
extractSave (store, typeClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1414
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Object
json The deserialized payload
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.
extractSingle (store, typeClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1431
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Object
json The deserialized payload
extractSingle
is used to deserialize a single record returned
from the adapter.
Example
import DS from 'ember-data';
export default DS.JSONSerializer.extend({
extractSingle: function(store, typeClass, payload) {
payload.comments = payload._embedded.comment;
delete payload._embedded;
return this._super(store, typeClass, payload);
},
});
extractUpdateRecord (store, typeClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1348
- store
- DS.Store
- typeClass
- DS.Model
- payload
- Object
- id
- (String|Number)
- requestType
- String
- returns
- Object
json The deserialized payload
extractUpdateRecord
is a hook into the extract method used when
a call is made to DS.Model#save
and the record has been updated.
By default this method is alias for extractSave.
keyForAttribute (key, method) String
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:308
- key
- String
- method
- String
- returns
- String
normalized key
keyForAttribute
can be used to define rules for how to convert an
attribute name in your model to a key in your JSON.
By default JSONAPISerializer
follows the format used on the examples of
http://jsonapi.org/format and uses dashes as the word separator in the JSON
attribute keys.
This behaviour can be easily customized by extending this method.
Example
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
keyForAttribute: function(attr, method) {
return Ember.String.dasherize(attr).toUpperCase();
}
});
keyForLink (key, kind) String
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1638
- key
- String
- kind
- String
belongsTo
orhasMany
- returns
- String
normalized key
keyForLink
can be used to define a custom key when deserializing link
properties.
keyForRelationship (key, typeClass, method) String
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:338
- key
- String
- typeClass
- String
- method
- String
- returns
- String
normalized key
keyForRelationship
can be used to define a custom key when
serializing and deserializing relationship properties.
By default JSONAPISerializer
follows the format used on the examples of
http://jsonapi.org/format and uses dashes as word separators in
relationship properties.
This behaviour can be easily customized by extending this method.
Example
import DS from 'ember-data';
export default DS.JSONAPISerializer.extend({
keyForRelationship: function(key, relationship, method) {
return Ember.String.underscore(key);
}
});
modelNameFromPayloadKey (key) String
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:263
- key
- String
- returns
- String
the model's modelName
normalize (modelClass, resourceHash) String
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:281
- modelClass
- DS.Model
- resourceHash
- Object
- returns
- String
normalize (typeClass, hash) Object
Inherited from DS.Serializer packages/ember-data/lib/system/serializer.js:93
- typeClass
- DS.Model
- hash
- Object
- returns
- Object
The normalize
method is used to convert a payload received from your
external data source into the normalized form store.push()
expects. You
should override this method, munge the hash and return the normalized
payload.
normalizeArrayResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:404
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeCreateRecordResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:339
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeDeleteRecordResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:352
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeFindAllResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:274
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeFindBelongsToResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:287
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeFindHasManyResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:300
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeFindManyResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:313
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeFindRecordResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:248
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeQueryRecordResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:261
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeQueryResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:326
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:189
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
The normalizeResponse
method is used to normalize a payload from the
server to a JSON-API Document.
http://jsonapi.org/format/#document-structure
This method delegates to a more specific normalize method based on
the requestType
.
To override this method with a custom one, make sure to call
return this._super(store, primaryModelClass, payload, id, requestType)
with your
pre-processed data.
Here's an example of using normalizeResponse
manually:
socket.on('message', function(message) {
var data = message.data;
var modelClass = store.modelFor(data.modelName);
var serializer = store.serializerFor(data.modelName);
var json = serializer.normalizeSingleResponse(store, modelClass, data, data.id);
store.push(normalized);
});
normalizeSaveResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:378
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeSingleResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:391
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
normalizeUpdateRecordResponse (store, primaryModelClass, payload, id, requestType) Object
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:365
- store
- DS.Store
- primaryModelClass
- DS.Model
- payload
- Object
- id
- String|Number
- requestType
- String
- returns
- Object
JSON-API Document
payloadKeyFromModelName (modelName) String
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:272
- modelName
- String
- returns
- String
pushPayload (store, payload)
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:163
- store
- DS.Store
- payload
- Object
serialize (snapshot, options) Object
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:368
- snapshot
- DS.Snapshot
- options
- Object
- returns
- Object
json
serialize (record, options) Object
Inherited from DS.Serializer packages/ember-data/lib/system/serializer.js:77
- record
- DS.Model
- options
- Object
- returns
- Object
The serialize
method is used when a record is saved in order to convert
the record into the form that your external data source expects.
serialize
takes an optional options
hash with a single option:
includeId
: If this istrue
,serialize
should include the ID in the serialized object it builds.
serializeAttribute (snapshot, json, key, attribute)
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:380
- snapshot
- DS.Snapshot
- json
- Object
- key
- String
- attribute
- Object
serializeBelongsTo (snapshot, json, relationship)
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:408
- snapshot
- DS.Snapshot
- json
- Object
- relationship
- Object
serializeHasMany (snapshot, json, relationship)
Defined in packages/ember-data/lib/serializers/json-api-serializer.js:441
- snapshot
- DS.Snapshot
- json
- Object
- relationship
- Object
serializeIntoHash (hash, typeClass, snapshot, options)
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1001
- hash
- Object
- typeClass
- DS.Model
- snapshot
- DS.Snapshot
- options
- Object
You can use this method to customize how a serialized record is added to the complete JSON hash to be sent to the server. By default the JSON Serializer does not namespace the payload and just sends the raw serialized JSON object. If your server expects namespaced keys, you should consider using the RESTSerializer. Otherwise you can override this method to customize how the record is added to the hash.
For example, your server may expect underscored root objects.
import DS from 'ember-data';
export default DS.RESTSerializer.extend({
serializeIntoHash: function(data, type, snapshot, options) {
var root = Ember.String.decamelize(type.modelName);
data[root] = this.serialize(snapshot, options);
}
});
serializePolymorphicType (snapshot, json, relationship)
Inherited from DS.JSONSerializer packages/ember-data/lib/serializers/json-serializer.js:1174
- snapshot
- DS.Snapshot
- json
- Object
- relationship
- Object
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
import DS from 'ember-data';
export default DS.JSONSerializer.extend({
serializePolymorphicType: function(snapshot, json, relationship) {
var key = relationship.key,
belongsTo = snapshot.belongsTo(key);
key = this.keyForAttribute ? this.keyForAttribute(key, "serialize") : key;
if (Ember.isNone(belongsTo)) {
json[key + "_type"] = null;
} else {
json[key + "_type"] = belongsTo.modelName;
}
}
});