Transform JSON to an appropriate format for RESTAdapter EmberJS

ember-data, ember.js, json

Solution

I ran into this issue earlier today. A nice clean way to fix it is to define a normalizePayload method for your ApplicationSerializer. It's made to be overwritten, so you aren't affecting anything else.

E.g.

App.ApplicationSerializer = DS.RESTSerializer.extend({
    normalizePayload: function(type, payload) {
        return { category: payload };
    }
}

If you want to do this on only some of the payloads processed then you just add a conditional inside it.

App.ApplicationSerializer = DS.RESTSerializer.extend({
    normalizePayload: function(type, payload) {
        if (type.toString() === 'App.Category') {
            return { category: payload };
        }
    }
}

For more info on the normalizePayload method see http://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_normalizePayload

Problem

I receive a JSON from our API that has the following format ``` [ { "id": 45, "name": "Pasta", "_order": 0, "is_hidden": null, "is_list": false }, { "id": 46, "name": "Salads", "_order": 1, "is_hidden": null, "is_list": false }, { "id": 47, "name": "Dessert", "_order": 2, "is_hidden": null, "is_list": false } ]; ``` I see that it has invalid format for standard RESTAdapter and I need to put the name of the model first. In my example it should probably be like: ``` { "category": [ { "id": 45, "name": "Pasta", "_order": 0, "is_hidden": null, "is_list": false }, { "id": 46, "name": "Salads", "_order": 1, "is_hidden": null, "is_list": false }, { "id": 47, "name": "Dessert", "_order": 2, "is_hidden": null, "is_list": false } ] } ``` So how to make it look this way in my adapter? It seems like I should use `DS.RESTSerializer`, but I can't figure out which method I should override...

Original source