将JSON转换为RESTAdapter EmberJS的适当格式

时间:2013-12-05 20:28:36

标签: json ember.js ember-data

我从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,但我无法弄清楚我应该覆盖哪种方法......

4 个答案:

答案 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
    }
});

编辑: 在您的情况下,您也可能需要覆盖extractArrayhttp://emberjs.com/api/data/classes/DS.RESTSerializer.html#method_extractArray

答案 2 :(得分:3)

normalizePayloadnormalize都不适合我。我在做的是:

// 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 + '}';

对于简单的用例,这些可能会更快,因为您可以避免反序列化和序列化。我只是不喜欢它,因为我宁愿使用数据表示的实际对象。如果你需要做一个更复杂的转换,那么在真正的单词术语中可能会比用一堆字符串连接/操作更容易理解。