Serialization 无法将Ember数据与JSONAPI和片段一起使用以支持嵌套的JSON数据 概述

Serialization 无法将Ember数据与JSONAPI和片段一起使用以支持嵌套的JSON数据 概述,serialization,ember.js,ember-data,json-api,Serialization,Ember.js,Ember Data,Json Api,我使用的是余烬数据,有一个JSONAPI。在我有一个更复杂的对象(比如一个通用概念的发票)和一个名为lineEntries的项目数组之前,一切都正常。行条目没有直接映射到表,因此需要存储为原始JSON对象数据。行输入模型还包含默认值和计算值。我希望将列表数据存储为一个JSON对象,然后在从存储中加载回来时,我可以在Ember中将其作为模型的数组进行正常操作 我试过的 我已经研究并尝试了几种方法,最好的方法似乎是(这里接受建议!): 碎片 用片段替换问题模型 我尝试将行条目模型设置为片段,然后将发

我使用的是余烬数据,有一个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模型


如果有人知道返回API数据的格式,它可能会解决这个问题。我尝试过JSONAPI,其中lineEntries返回的格式与保存的格式相同。我尝试过放置关系部分,如建议的附加组件,还尝试过将仅关系数据放置在条目和包含所有引用的include部分。这方面的任何帮助都将是非常好的,因为我从中学到了很多,但最后期限迫在眉睫,我看不到一个可行的解决方案,该解决方案不会像它修复的那样中断。

如果您正在从API服务器寻找关系数据的返回格式,您需要确保以下几点:

{
  data: {
    "type":"unicorn",
    "id": req.params.id,
    "attributes": {
      "unicorn-name" : "This is a new name!"
    }
  }
}
  • 确保在余烬模型中定义了关系
  • 返回状态代码为200的所有成功
  • 从这里开始,您需要确保正确返回关系数据。如果已将关系的ember模型设置为
    {async:true}
    ,则只需返回关系模型的id,该id也应在ember中定义。如果未设置
    {async:true}
    ,则ember希望包含所有关系数据

  • 返回JSON API规范中具有关系的数据
  • 例子: 余烬中的
    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的问题