【问题标题】:Ember-Data: How to get properties from nested JSONEmber-Data:如何从嵌套的 JSON 中获取属性
【发布时间】:2014-07-23 21:01:09
【问题描述】:

我正在以这种格式返回 JSON:

{
  "status": "success",
  "data": {
    "debtor": {
      "debtor_id": 1301,
      "key": value,
      "key": value,
      "key": value
    }
  }
}

不知何故,我的RESTAdapter 需要从 JSON 的“债务人”部分提供我的债务人模型属性。

目前,我从服务器成功回调,但控制台错误提示 Ember 找不到“状态”模型。我在Ember Model Guide中找不到这样嵌套的JSON怎么处理?

到目前为止,我已经能够做一些简单的事情,比如扩展RESTSerializer 以接受“debtor_id”作为主键,并删除 GET URL 请求的复数形式......但我找不到任何了解深度嵌套 JSON 属性的明确指南。

为了清晰起见扩展问题细节:

我需要以某种方式更改适配器/序列化程序的默认行为,因为这个 JSON 约定被用于我的 Ember 应用程序以外的许多目的。


到目前为止我的解决方案:

与一位朋友一起,我们得以剖析"extract API"(感谢@lame_coder 指点我)

我们想出了一种根据具体情况扩展序列化程序的方法,但不确定它是否真的是“Ember Approved”解决方案...

// app/serializers/debtor.js
export default DS.RESTSerializer.extend({
    primaryKey: "debtor_id",
    extract: function(store, type, payload, id, requestType) {
        payload.data.debtor.id = payload.data.debtor.debtor_id;
        return payload.data.debtor;
    }
});

似乎即使我能够为 requesting 数据更改我的 primaryKey,Ember 仍在尝试使用硬编码 ID 来识别正确的记录(而不是我已设置)。所以我们只是重写了extract 方法来强制Ember 寻找我想要的正确主键。

同样,这对我目前有效,但我还没有看到这种变化是否会导致任何问题......

如果有人有任何见解,我仍然会寻找可能更稳定/可重用/面向未来/等的不同解决方案?

【问题讨论】:

    标签: json ember.js ember-data


    【解决方案1】:

    从问题描述看来,您的模型定义和 JSON 结构不匹配。你需要让它完全一样才能被序列化器正确映射。

    如果您决定更改您的 REST API 返回语句,将类似于(我使用的是模拟数据)

    //your Get method on service
    public object Get()
    {
        return new {debtor= new { debtor_id=1301,key1=value1,key2=value2}};
    }
    

    【讨论】:

    • 我正在寻找一种方法来自定义适配器/序列化器的默认行为。更改 JSON 结构不是一种选择,因为除了 Ember 之外还有许多其他程序使用这些 API。
    • 好的。然后,如以下文档中所述,您可以按照您想要的方式解析有效负载并帮助序列化程序对您的模型进行水合。 emberjs.com/api/data/classes/…
    • 谢谢。一开始看起来有点复杂……看看我能不能解决它。
    【解决方案2】:

    ember 所期望的 json 需要如下所示:

    "debtor": {
      "id": 1301,
      "key": value,
      "key": value,
      "key": value
    }
    

    它将状态视为需要为其加载数据的模型。下一个问题是它需要有“id”而不是“debtor_id”。

    如果您需要返回多个对象,您可以这样做:

    "debtors": [{
      "id": 1301,
      "key": value,
      "key": value,
      "key": value
    },{
    "id": 1302,
      "key": value,
      "key": value,
      "key": value
    }]
    

    有意义吗?

    【讨论】:

    • 看来我需要更改适配器/序列化程序的行为。更改 JSON 结构不是一种选择,因为除了我的 Ember 应用程序之外,还有许多其他程序使用这些 API。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2015-04-12
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多