我已经真正搜索过了,我还没有找到一个使用序列化程序从不同格式的JSON响应中获取对象的好例子。我在http://flask.pocoo.org/docs/security/#json-security概述了不更改JSON响应格式的原因。
我对javascript还不是很好,所以我很难理解serialize_json.js中的钩子,或者我应该使用map(我只是不知道)。所以这是我对许多对象的JSON响应的一个例子:
{
"total_pages": 1,
"objects": [
{
"is_completed": true,
"id": 1,
"title": "I need to eat"
},
{
"is_completed": false,
"id": 2,
"title": "Hey does this work"
},
{
"is_completed": false,
"id": 3,
"title": "Go to sleep"
},
],
"num_results": 3,
"page": 1
}
当ember-data尝试使用它时,我收到以下错误:
DEBUG: -------------------------------
DEBUG: Ember.VERSION : 1.0.0-rc.1
DEBUG: Handlebars.VERSION : 1.0.0-rc.3
DEBUG: jQuery.VERSION : 1.9.1
DEBUG: -------------------------------
Uncaught Error: assertion failed: Your server returned a hash with the key total_pages but you have no mapping for it
当您查看我的数据存储代码时,这完全可以做到:
Todos.Store = DS.Store.extend({
revision: 12,
adapter: DS.RESTAdapter.create({
mappings: {objects: "Todos.Todo"},
namespace: 'api'
})
});
我的问题是如何处理total_pages
,num_results
和page
?通过交易,我的意思是忽略,所以我可以只映射objects
数组。
答案 0 :(得分:3)
您在JSON结果中返回的所有根属性都将映射到Ember Data中的DS.Model。您不应该返回未建模的属性,也不应该对它们进行建模。
如果你想摆脱错误,你应该为你不使用的属性制作一个空模型。
了解更多here
为什么要退回不想使用的属性?还是不受你的控制?
答案 1 :(得分:1)
查看this post关于ember的去向。 TL; DR因为有很多不同的api调用实现,他们正在努力支持JSON API。
根据我的理解,没有简单的方法来做你所要求的。您最好的选择是编写自己的自定义适配器并进行序列化。这不应该太难做,而且以前做过。我建议你看一下用于Python的Django Tastypie的Tastypie adapter
答案 2 :(得分:1)
实现此目的的方法是使用自定义序列化程序。如果以这种格式从服务器返回所有数据,您只需创建ApplicationSerializer
,如下所示:
DS.RESTSerilizer.extend({
normalizePayload: function(type, payload) {
delete payload.total_pages;
delete payload.num_results;
delete payload.page;
return payload;
}
});
这应该允许Ember Data无缝地使用您的API。