I am trying to normalize data from a REST API. I will not modify the JSON response.
How can I summarize this JSON answer to pull inline records so that they are in a loaded format.
The server response is as follows:
{
"objects": [
{
"active": true,
"admin": true,
"created_at": "2013-11-21T15:12:37.894390",
"email": "me@example.com",
"first_name": "Joe",
"id": 1,
"last_name": "Joeson",
"projects": [
{
"created_at": "2013-11-21T15:13:13.150572",
"id": 1,
"name": "Super awesome project",
"updated_at": "2013-11-21T15:13:13.150606",
"user_id": 1
}
],
"updated_at": "2013-12-06T19:50:17.035881"
},
{
"active": true,
"admin": false,
"created_at": "2013-11-21T17:53:17.155700",
"email": "craig@example.com",
"first_name": "Craig",
"id": 2,
"last_name": "Craigson",
"projects": [
{
"created_at": "2013-11-21T17:54:05.527790",
"id": 2,
"name": "Craig project",
"updated_at": "2013-11-21T17:54:05.527808",
"user_id": 2
},
{
"created_at": "2013-11-21T17:54:29.557801",
"id": 3,
"name": "Future ideas",
"updated_at": "2013-11-21T17:54:29.557816",
"user_id": 2
}
],
"updated_at": "2013-11-21T17:53:17.155717"
}
]
}
I want to change the JSON payload so that it looks like a JSON response waiting for ember data: I'm trying to normalize data from a REST API. I will not modify the JSON response.
How to basically execute this JSON response to pull inline records so that they are in a loaded format. The response from the server is as follows:
{
"objects": [
{
"active": true,
"admin": true,
"created_at": "2013-11-21T15:12:37.894390",
"email": "me@example.com",
"first_name": "Joe",
"id": 1,
"last_name": "Joeson",
"updated_at": "2013-12-06T19:50:17.035881"
"projects": [1]
},
{
"active": true,
"admin": false,
"created_at": "2013-11-21T17:53:17.155700",
"email": "craig@example.com",
"first_name": "Craig",
"id": 2,
"last_name": "Craigson",
"updated_at": "2013-11-21T17:53:17.155717"
"projects": [2, 3]
}
],
"projects": [
{
"created_at": "2013-11-21T15:13:13.150572",
"id": 1,
"name": "Super awesome project",
"updated_at": "2013-11-21T15:13:13.150606",
"user_id": 1
},
{
"created_at": "2013-11-21T17:54:05.527790",
"id": 2,
"name": "Craig project",
"updated_at": "2013-11-21T17:54:05.527808",
"user_id": 2
},
{
"created_at": "2013-11-21T17:54:29.557801",
"id": 3,
"name": "Future ideas",
"updated_at": "2013-11-21T17:54:29.557816",
"user_id": 2
}
]
}
So far I am expanding DS.RESTSerializer:
App.ApplicationSerializer = DS.RESTSerializer.extend({
extractArray: function(store, type, payload, id, requestType) {
var result = {};
result[type.typeKey] = payload.objects;
payload = result;
return this._super(store, type, payload, id, requestType);
},
extractSingle: function(store, type, payload, id, requestType) {
var result;
var model = type.typeKey;
if (payload.object) {
result = payload.object;
} else {
result = payload;
}
var embedObjs, embedKey;
type.eachRelationship(function(key, relationship) {
if (relationship.kind === 'hasMany') {
embedKey = key;
for (var i = 0; i < result[key].length; i++) {
result.key.push(result[key][i].id);
}
embedObjs = result[key].pop();
}
});
payload[model] = result;
if (!payload[embedKey])
payload[embedKey] = [];
payload[embedKey].push(embedObjs);
return this._super(store, type, payload, id, requestType);
}
});
My models look like where they projectbelong user:
App.User = DS.Model.extend({
active: DS.attr(),
admin: DS.attr(),
email: DS.attr(),
firstName: DS.attr(),
lastName: DS.attr(),
password: DS.attr(),
createdAt: DS.attr(),
updatedAt: DS.attr(),
projects: DS.hasMany('project')
});
App.Project = DS.Model.extend({
createdAt: DS.attr(),
name: DS.attr(),
updatedAt: DS.attr(),
userId: DS.belongsTo('user')
});
-, , , , extractSingle. JavaScript: "Assertion failed: : TypeError: " toString " undefined". .