Ember数据的JSON格式不正确

Cra*_*bar 5 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"
}]
Run Code Online (Sandbox Code Playgroud)

而下一个型号:

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')
});
Run Code Online (Sandbox Code Playgroud)

我不明白如何使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"
    }
}]
Run Code Online (Sandbox Code Playgroud)

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

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"))
Run Code Online (Sandbox Code Playgroud)

超过一百个类似的记录(即服务器根据请求返回的记录数).而且没有数据存储.

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

Igo*_*rra 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
Run Code Online (Sandbox Code Playgroud)

这会产生这样的东西:

version: 1.13.8
installing serializer
  create app/serializers/book.js
installing serializer-test
  create tests/unit/serializers/book-test.js
Run Code Online (Sandbox Code Playgroud)

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

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

export default DS.RESTSerializer.extend({
});
Run Code Online (Sandbox Code Playgroud)

然后换RESTSerializerJSONSerializer:

import DS from 'ember-data';

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

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


Tom*_*and 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);
  }
});
Run Code Online (Sandbox Code Playgroud)

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

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

编辑- 更改了上述建议的答案(使用“类型”来构建根密钥)。