Подтвердить что ты не робот

Как создать пользовательский Serializer для данных Ember

У меня есть API, который возвращает JSON, который неправильно отформатирован для потребления Ember. Вместо этого (что ожидает ember):

{ events: [
    { id: 1, title: "Event 1", description: "Learn Ember" },
    { id: 2, title: "Event 2", description: "Learn Ember 2" }
]}

Я получаю:

{ events: [
    { event: { id: 1, "Event 1", description: "Learn Ember" }},
    { event: { id: 2, "Event 2", description: "Learn Ember 2" }}
]}

Итак, если я правильно понял, мне нужно создать пользовательский Serializer для изменения JSON.

var store = DS.Store.create({
    adapter: DS.RESTAdapter.create({
        serializer: DS.Serializer.create({
            // which hook should I override??
        })
    })
});

Я прочитал комментарий к коду, связанный с DS.Serializer, но я не могу понять, как добиться того, что я хочу...

Как я могу это сделать?

ps: Моя цель - сделать работу App.Event.find(). В настоящее время я получаю Uncaught Error: assertion failed: Your server returned a hash with the key 0 but you have no mapping for it. Вот почему мне нужно исправить полученный JSON.

edit: вот как я сделал это, пока:

extractMany: function(loader, json, type, records) {
    var root = this.rootForType(type),
    roots = this.pluralize(root);

    json = reformatJSON(root, roots, json);
    this._super(loader, json, type, records);
  }
4b9b3361

Ответ 1

Я предполагаю, что ответы содержат только идентификаторы и что вы пытаетесь их извлечь.

Вам понадобится подкласс DS.JSONSerializer, который поставляет основное поведение для работы с полезными нагрузками JSON. В частности, вы захотите переопределить крюк extractHasMany:

// elsewhere in your file
function singularize(key) {
  // remove the trailing `s`. You might want to store a hash of
  // plural->singular if you deal with names that don't follow
  // this pattern
  return key.substr(0, key.length - 1);
}

DS.JSONSerializer.extend({
  extractHasMany: function(type, hash, key) {
    return hash[key][singularize(key)].id;
  }
})