Serialization 无法将Ember数据与JSONAPI和片段一起使用以支持嵌套的JSON数据 概述
我使用的是余烬数据,有一个JSONAPI。在我有一个更复杂的对象(比如一个通用概念的发票)和一个名为lineEntries的项目数组之前,一切都正常。行条目没有直接映射到表,因此需要存储为原始JSON对象数据。行输入模型还包含默认值和计算值。我希望将列表数据存储为一个JSON对象,然后在从存储中加载回来时,我可以在Ember中将其作为模型的数组进行正常操作 我试过的 我已经研究并尝试了几种方法,最好的方法似乎是(这里接受建议!): 碎片 用片段替换问题模型 我尝试将行条目模型设置为片段,然后将发票模型上的片段作为片段数组引用。行条目作为正常值添加到数组中,但默认值不起作用(是否应该?)。它创建了对象,我可以将其存储在后端,但当我返回它时,它会失败,出现规范化问题或序列化问题。有人能说明返回数据的格式吗?这令人困惑,因为规范化数据似乎需要JSONAPI,但片段需要JSON serialiser。我试过几种组合,但到目前为止运气不好。我的行条目没有实际ID,因为数据是作为块保存和加载的。这是一个问题吗 DS.EmbeddedRecordsMixin 尽管JSONAPI中不支持,但对于问题模型,使用JSONAPI然后切换到JSONSerializer或RESTSerializer似乎是可能的。如果这是可能的,有人能给我一个工作示例和API应该返回的JSON格式吗?我有头授权和其他类似的数据,所以我仍然能够在应用程序级别为所有不使用JSONAPI的请求设置这些数据吗 余烬数据保存关系 我找到了一个插件,它提供了一个插件来执行此操作。它似乎比其他方法更复杂,但当我尝试了这个方法后,我可以通过将数据设置为嵌入式来发送数据。伟大的但是,尽管它保存了,但它并没有正确地打开,我又带着同样的问题回来了 自定义串行器 将models serialiser替换为接收数据并将其作为纯JSON数据发送,然后反序列化为Ember可以使用的内容。这听起来和上面的相似,但我做的是举重。这样做的唯一原因是,上述解决方案的所有示例都非常简单,并没有真正展示如何使用实际需要的JSONAPI设置来设置它 我在哪里,我需要什么 基本上,所有的方法都可以很好地保存JSON,但是服务器返回的JSON格式不正确,或者反序列化失败,但是不清楚应该是什么,或者需要更改什么,而不破坏工作正常的现有JSONAPI模型Serialization 无法将Ember数据与JSONAPI和片段一起使用以支持嵌套的JSON数据 概述,serialization,ember.js,ember-data,json-api,Serialization,Ember.js,Ember Data,Json Api,我使用的是余烬数据,有一个JSONAPI。在我有一个更复杂的对象(比如一个通用概念的发票)和一个名为lineEntries的项目数组之前,一切都正常。行条目没有直接映射到表,因此需要存储为原始JSON对象数据。行输入模型还包含默认值和计算值。我希望将列表数据存储为一个JSON对象,然后在从存储中加载回来时,我可以在Ember中将其作为模型的数组进行正常操作 我试过的 我已经研究并尝试了几种方法,最好的方法似乎是(这里接受建议!): 碎片 用片段替换问题模型 我尝试将行条目模型设置为片段,然后将发
如果有人知道返回API数据的格式,它可能会解决这个问题。我尝试过JSONAPI,其中lineEntries返回的格式与保存的格式相同。我尝试过放置关系部分,如建议的附加组件,还尝试过将仅关系数据放置在条目和包含所有引用的include部分。这方面的任何帮助都将是非常好的,因为我从中学到了很多,但最后期限迫在眉睫,我看不到一个可行的解决方案,该解决方案不会像它修复的那样中断。如果您正在从API服务器寻找关系数据的返回格式,您需要确保以下几点:
{
data: {
"type":"unicorn",
"id": req.params.id,
"attributes": {
"unicorn-name" : "This is a new name!"
}
}
}
{async:true}
,则只需返回关系模型的id,该id也应在ember中定义。如果未设置{async:true}
,则ember希望包含所有关系数据
models\unicorn.js
:
import DS from 'ember-data';
export default DS.Model.extend({
user: DS.belongsTo('user', {async: true}),
staticrace: DS.belongsTo('staticrace',{async: true}),
unicornName: DS.attr('string'),
unicornLevel: DS.attr('number'),
experience: DS.attr('number'),
hatchesAt: DS.attr('number'),
isHatched: DS.attr('boolean'),
raceEndsAt: DS.attr('number'),
isRacing: DS.attr('boolean'),
});
在api服务器上的GET/:id
上的routes\unicorns.js
中:
var jsonObject = {
"data": {
"type": "unicorn",
"id": unicorn.dataValues.id,
"attributes": {
"unicorn-name" : unicorn.dataValues.unicornName,
"unicorn-level" : unicorn.dataValues.unicornLevel,
"experience" : unicorn.dataValues.experience,
"hatches-at" : unicorn.dataValues.hatchesAt,
"is-hatched" : unicorn.dataValues.isHatched,
"raceEndsAt" : unicorn.dataValues.raceEndsAt,
"isRacing" : unicorn.dataValues.isRacing
},
"relationships": {
"staticrace": {
"data": {"type": "staticrace", "id" : unicorn.dataValues.staticRaceId}
},
"user":{
"data": {"type": "user", "id" : unicorn.dataValues.userId}
}
}
}
}
res.status(200).json(jsonObject);
在ember中,可以通过链接模型函数来调用它。例如,当这只独角兽在controllers\unicorracer.js中比赛时:
raceUnicorn() {
if (this.get('unicornId') === '') {return false}
else {
return this.store.findRecord('unicorn', this.get('unicornId', { backgroundReload: false})).then(unicorn => {
return this.store.findRecord('staticrace', this.get('raceId')).then(staticrace => {
if (unicorn.getProperties('unicornLevel').unicornLevel >= staticrace.getProperties('raceMinimumLevel').raceMinimumLevel) {
unicorn.set('isRacing', true);
unicorn.set('staticrace', staticrace);
unicorn.set('raceEndsAt', Math.floor(Date.now()/1000) + staticrace.get('duration'))
this.set('unicornId', '');
return unicorn.save();
}
else {return false;}
});
});
}
}
上述代码向api服务器路由发送一个补丁unicorns/:id
关于获取
,发布
,删除
,补丁
的最后说明:
GET
假设您正在获取与模型相关的所有信息(上面的示例显示了GET
响应)。这与model.findRecord(GET/:id)(需要一条记录)、model.findAll(GET/)(需要一个记录数组)、model.query(GET/?query=&string=)(需要一个记录数组)、model.queryRecord(GET/?query=&string=)(需要一条记录)相关联
POST
假设您至少从ember向api服务器返回了POST
的内容,但也可以返回您在apiServer端创建的其他信息,如createdAt日期。如果返回的数据与用于创建模型的数据不同,它将使用返回的信息更新创建的模型。这与model.createRecord(POST/)关联(需要一条记录)
DELETE
假定您返回的是已删除对象的类型和id,而不是数据或关系。这与model.deleteRecord(DELETE/:id)(需要一条记录)关联
PATCH
假定您至少返回更改的信息。如果您只更改一个字段,例如在我的unicorn
模型中,unicornName
,它将只修补以下内容:
{
data: {
"type":"unicorn",
"id": req.params.id,
"attributes": {
"unicorn-name" : "This is a new name!"
}
}
}
因此,它只希望返回至少该值的响应,但就像POST
,您可以返回其他更改的项目
我希望这能回答您关于JSON API ada的问题