#

API Docs for: v3.8.1
Show: Inherited Protected Private Deprecated

# DS.Serializer Class

Extends EmberObject
Defined in: `addon/serializer.js:7`
Module: ember-data

`DS.Serializer` is an abstract base class that you should override in your application to customize it for your backend. The minimum set of methods that you should implement is:

- `normalizeResponse()`
- `serialize()`

And you can optionally override the following methods:

- `normalize()`

For an example implementation, see DS.JSONSerializer, the included JSON serializer.

- Index
- Methods
- Properties

## Item Index

### Methods

- normalize
- normalizeResponse
- serialize

### Properties

- store

## Methods

### `normalize`

(

- `typeClass`
- `hash`

)
Object

Defined in `addon/serializer.js:128`

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.

Example:

    Serializer.extend({
      normalize(modelClass, resourceHash) {
        var data = {
          id:            resourceHash.id,
          type:          modelClass.modelName,
          attributes:    resourceHash
        };
        return { data: data };
      }
    })

#### Parameters:

- `typeClass` DS.Model
- `hash` Object

#### Returns:

Object:

### `normalizeResponse`

(

- `store`
- `primaryModelClass`
- `payload`
- `id`
- `requestType`

)
Object

Defined in `addon/serializer.js:50`

Available since 1.13.0

The `normalizeResponse` method is used to normalize a payload from the server to a JSON-API Document.

http://jsonapi.org/format/#document-structure

Example:

    Serializer.extend({
      normalizeResponse(store, primaryModelClass, payload, id, requestType) {
        if (requestType === 'findRecord') {
          return this.normalize(primaryModelClass, payload);
        } else {
          return payload.reduce(function(documentHash, item) {
            let { data, included } = this.normalize(primaryModelClass, item);
            documentHash.included.push(...included);
            documentHash.data.push(data);
            return documentHash;
          }, { data: [], included: [] })
        }
      }
    });

#### Parameters:

- `store` DS.Store
- `primaryModelClass` DS.Model
- `payload` Object
- `id` String | Number
- `requestType` String

#### Returns:

Object:

JSON-API Document

### `serialize`

(

- `snapshot`
- `[options]`

)
Object

Defined in `addon/serializer.js:86`

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 is `true`, `serialize` should include the ID in the serialized object it builds.

Example:

    Serializer.extend({
      serialize(snapshot, options) {
        var json = {
          id: snapshot.id
        };

        snapshot.eachAttribute((key, attribute) => {
          json[key] = snapshot.attr(key);
        });

        snapshot.eachRelationship((key, relationship) => {
          if (relationship.kind === 'belongsTo') {
            json[key] = snapshot.belongsTo(key, { id: true });
          } else if (relationship.kind === 'hasMany') {
            json[key] = snapshot.hasMany(key, { ids: true });
          }
        });

        return json;
      },
    });

#### Parameters:

- `snapshot` DS.Snapshot
- `[options]` Object optional

#### Returns:

Object:

## Properties

### `store`

DS.Store public

Defined in `addon/serializer.js:28`

The `store` property is the application's `store` that contains all records. It can be used to look up serializers for other model types that may be nested inside the payload response.

Example:

    Serializer.extend({
      extractRelationship(relationshipModelName, relationshipHash) {
        var modelClass = this.store.modelFor(relationshipModelName);
        var relationshipSerializer = this.store.serializerFor(relationshipModelName);
        return relationshipSerializer.normalize(modelClass, relationshipHash);
      }
    });