我从API获得了一个具有以下格式的JSON
[
{
"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
}
];
我看到它的标准RESTAdapter格式无效,我需要先放置模型的名称。在我的例子中它可能应该是:
{
"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
}
]
}
那么如何让它在我的适配器中看起来如此?看起来我应该使用DS.RESTSerializer
,但我无法弄清楚我应该覆盖哪种方法......
答案 0 :(得分:4)
我今天早些时候遇到过这个问题。修复它的一个很好的清洁方法是定义一个 ApplicationSerializer的normalizePayload方法。它被覆盖了,所以你不会影响其他任何东西。
E.g。
App.ApplicationSerializer = DS.RESTSerializer.extend({
normalizePayload: function(type, payload) {
return { category: payload };
}
}
如果您只想对已处理的某些有效负载执行此操作,则只需在其中添加条件。
App.ApplicationSerializer = DS.RESTSerializer.extend({
normalizePayload: function(type, payload) {
if (type.toString() === 'App.Category') {
return { category: payload };
}
}
}
有关normalizePayload方法的更多信息,请参阅http://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_normalizePayload
答案 1 :(得分:3)
一般情况下,如果必须调整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
}
});
编辑:
在您的情况下,您也可能需要覆盖extractArray
:http://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_extractArray
答案 2 :(得分:3)
normalizePayload
和normalize
都不适合我。我在做的是:
// app/serializers/application.js
import DS from 'ember-data';
export default DS.RESTSerializer.extend({
extractArray: function(store, type, payload) {
var payloadTemp = {}
payloadTemp[type.typeKey] = payload;
return this._super(store, type, payloadTemp);
},
extractSingle: function(store, type, payload, id) {
var payloadTemp = {}
payloadTemp[type.typeKey] = [payload];
return this._super(store, type, payloadTemp, id);
}
});
答案 3 :(得分:1)
将JSON字符串表示的对象嵌套在一个新对象中,该对象添加所需的新属性,然后转换回JSON。像这样:
var yourInitialJSONString; // your JSON from API
var obj = JSON.parse(yourInitialJSONString);
var newObj = {
category: obj
};
var finalJSON = JSON.stringify(newObj);
或者,虽然可能只是最简单的情况,而不是像处理实际对象那样普遍有用,但您可以简单地连接到您的JSON:
var yourInitialJSONString; // your JSON from API
var finalJSON = '{"category":' + yourInitialJSONString + '}';
对于简单的用例,这些可能会更快,因为您可以避免反序列化和序列化。我只是不喜欢它,因为我宁愿使用数据表示的实际对象。如果你需要做一个更复杂的转换,那么在真正的单词术语中可能会比用一堆字符串连接/操作更容易理解。