我收到以这种格式返回的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寻找我想要的正确主键。
同样,这对我来说当前有效,但我还没有看到这种变化是否会导致任何问题向前发展....
如果有人有任何见解,我仍然会寻找可能更稳定/可重复使用/面向未来/等的其他解决方案?
答案 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
}]
有意义吗?