Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Transform JSON to an appropriate format for RESTAdapter EmberJS

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...

like image 401
DaZzz Avatar asked Dec 05 '13 20:12

DaZzz


2 Answers

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

like image 171
Paolo Avatar answered Sep 30 '22 08:09

Paolo


In general, you'll probably want to implement a couple of methods in your serializer if you have to tweak your JSON:

App.ApplicationSerializer = DS.RESTSerializer.extend({
    normalize: function(type, hash, prop) {
        // change your incoming JSON to ember-style here
    },
    serialize: function(record, options) {
        // change your outgoing ember-data record to your server's JSON here
    }
});

EDIT: You may also in your case need to override extractArray as well: http://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_extractArray

like image 24
Steve H. Avatar answered Sep 30 '22 08:09

Steve H.