Ember数据的JSON格式不正确

时间:2015-07-30 18:58:56

标签: json ember.js ember-data

我使用的是最新版本的EmberJS和Ember Data。 我有下一个JSON数据:

[{
    "id": 6,
    "name": "First object",
    "vol": 40,
    "description": "bla bla bla",
    "category": "first"
}, {
    "id": 7,
    "name": "Second object",
    "vol": 17,
    "description": "Some description",
    "category": "second"
}]

下一个模型:

import DS from 'ember-data';

export default DS.Model.extend({
  name: DS.attr('string'),
  vol: DS.attr('number'),
  description: DS.attr('string'),
  category: DS.attr('string')
});

我不明白如何使Ember数据有效。我怀疑ember数据需要下面的内容:

[{ 
    model-name {
        "id": 6,
        "name": "First object",
        "vol": 40,
        "description": "bla bla bla",
        "category": "first"
    }
}, { 
    model-name {
        "id": 7,
        "name": "Second object",
        "vol": 17,
        "description": "Some description",
        "category": "second"
    }
}]

在控制台中我有一堆警告:

WARNING: Encountered "0" in payload, but no model was found for model
name "0" (resolved model name using emdber-drink-
it@serializer:application:.modelNameFromPayloadKey("0"))
WARNING: Encountered "1" in payload, but no model was found for model
name "1" (resolved model name using emdber-drink-
it@serializer:application:.modelNameFromPayloadKey("1"))

超过一百个类似记录(即服务器根据请求返回的记录数)。 商店里没有数据。

如何在不更改从服务器收到的JSON的情况下解决此问题?

3 个答案:

答案 0 :(得分:5)

来自http://emberjs.com/api/data/classes/DS.JSONSerializer.html

  

在Ember Data中,序列化器用于序列化和反序列化   记录何时转入和转出外部来源。   此过程涉及规范化属性名称,进行转换   属性值和序列化关系。

目前有4种类型的序列化器:

您拥有的JSON数据是普通的json。

  

JSONSerializer对于可能没有的更简单或传统后端非常有用   支持http://jsonapi.org/规范

所以你需要 JSONSerializer 这是使用普通json数据的最简单的解决方案。
使用ember-cli非常容易创建一个新的序列化程序,例如模型book

ember generate serializer book

会产生这样的东西:

version: 1.13.8
installing serializer
  create app/serializers/book.js
installing serializer-test
  create tests/unit/serializers/book-test.js

上一个命令将创建一个 RESTSerializer 类型的序列化器。 (如果你不使用ember -cli只是手边创建这个文件)

// app/serializers/book.js
import DS from 'ember-data';

export default DS.RESTSerializer.extend({
});

然后按RESTSerializer更改JSONSerializer

import DS from 'ember-data';

export default DS.JSONSerializer.extend({
    primaryKey: '_id', // useful for mongodb-like data
});

我希望你像我一样喜欢学习余烬。

答案 1 :(得分:2)

您应该能够添加自定义序列化程序,以便为JSON数据添加根密钥。我没有测试过这个,但你可以尝试类似的东西:

(以“书”模型为例)

// app/serializers/book.js
import DS from 'ember-data';

export default DS.RESTSerializer.extend({
  extractArray: function(store, type, payload) {
    var newPayload = {};
    newPayload[type.modelName] = payload;
    return this._super(store, type, newPayload);
  }
});

如果这是整个API的问题,那么您可能需要为整个应用程序创建一个自定义序列化程序,并使用传入的type参数来构建根密钥。

另外作为旁注,如果我无法控制API,我可能不会使用Ember Data。除非它遵循像jsonapi.org这样严格的指导方针,否则你一定会遇到一些麻烦。

编辑 - 更改了上述建议的答案(使用'type'构建根密钥)。

答案 2 :(得分:0)

我采取了另一种方法并重载了#model; modelNameFromPayloadKey'方法

如果有效负载密钥的类型为整数,则它将映射到模型的名称。

// app/serializers/<model>.js
import DS from 'ember-data';
import normalizeModelName from "ember-data/-private/system/normalize-model-name";
import {singularize} from "ember-inflector";

export default DS.RESTSerializer.extend({
  model: '<model>',

  modelNameFromPayloadKey(key) {
    // Check whether the key is of type integer
    if (!isNaN(key)) {
      return normalizeModelName(this.get('model'));
    }
    return singularize(normalizeModelName(key));
  },

});