Ember-Data:如何从嵌套的JSON获取属性

时间:2014-07-23 21:01:09

标签: json ember.js ember-data

我收到以这种格式返回的JSON:

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

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

目前,我正在从服务器成功回拨,但是控制台错误说Ember无法找到“状态”的模型。我在Ember Model Guide中找不到如何处理嵌套的JSON?

到目前为止,我已经能够做一些简单的事情,例如将RESTSerializer扩展为接受“debtor_id”作为primaryKey,并且还删除了GET URL请求的复数...但我可以'找到任何明确的指南来获得深层嵌套的JSON属性。

为了清晰起见,请扩展问题详细信息:

我需要以某种方式改变Adapter / Serializer的默认行为,因为除了我的Ember应用程序之外,这个JSON约定被用于许多目的。


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

有了朋友,我们能够剖析"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;
    }
});

似乎即使我能够为请求数据更改我的primaryKey,Ember仍然尝试使用硬编码ID来识别正确的记录(而不是debtor_id)我已经设定了)。所以我们只是覆盖了extract方法,迫使Ember寻找我想要的正确主键。

同样,这对我来说当前有效,但我还没有看到这种变化是否会导致任何问题向前发展....

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

2 个答案:

答案 0 :(得分:2)

从问题描述看,您的模型定义和JSON结构不匹配。您需要使它完全相同才能通过Serializer正确映射。

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

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

答案 1 :(得分:1)

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
}]

有意义吗?