Ember.js REST Adapter without JSON root

api, ember-data, ember.js, javascript, json

Solution

Yes, you can write your own custom REST adapter. Take a look at the source code in the JSONSerializer, RESTSerializer (which extends the JSONSerializer), and the REST adapter.

Basically, the you need to override the `extract*` methods from the JSONSerializer.

Currently, it looks something like this:

extract: function(loader, json, type, record) {
  var root = this.rootForType(type);

  this.sideload(loader, type, json, root);
  this.extractMeta(loader, type, json);

  if (json[root]) {
    if (record) { loader.updateId(record, json[root]); }
    this.extractRecordRepresentation(loader, type, json[root]);
  }
},

Notice how it checks `json[root]` -- you'd have to write your custom method based on your expected API response.

Another approach would be to "preprocess" the json from the API to use a root element. You could do this by finding out what methods call `extract*` (which passes it the json) and before it does so, modify the json to contain the root element.

Hope this helps, please let me know if it's unclear.

Problem

The Ember.js REST Adapter expects the JSON to be returned as: ``` { "person": { "first_name": "Barack", "last_name": "Obama", "is_person_of_the_year": true } } ``` But my API returns the data without a root element: ``` { "first_name": "Barack", "last_name": "Obama", "is_person_of_the_year": true } ``` Is it possible to customize the REST Adapter so that it accepts my JSON data? Right now it's showing "Assertion failed: Your server returned a hash with the key 0 but you have no mapping for it" UPDATE: Based on Sherwin Yu's answer below, this is what I came up with, seems to work so far: https://gist.github.com/richardkall/5910875

Original source