Transform JSON to an appropriate format for RESTAdapter EmberJS

Viewed 6303

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

4 Answers

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

Just nest the object represented by your JSON string inside a new object which adds the new property needed and then convert back to JSON. Like this:

var yourInitialJSONString; // your JSON from API 
var obj = JSON.parse(yourInitialJSONString);
var newObj = {
    category: obj
};
var finalJSON = JSON.stringify(newObj);

Alternatively, though probably only best for simple case and not as universally useful as working with actual objects, you could simply concatenate to your JSON:

var yourInitialJSONString; // your JSON from API
var finalJSON = '{"category":' + yourInitialJSONString + '}';

These might prove faster for simple use cases as you avoid deserialization and serialization. I just don't like it as much as I would rather work with actual objects represented by the data. If you need to do a more complex transformation it would probably prove to be more understandable in real word terms than doing a bunch of string concatenation/manipulation.

Related