我正努力将我的JSON“拼凑”成正确的格式。
为了说明我做了一个快速的,JSfiddle。
http://jsfiddle.net/chrismasters/NQKvy/638/
服务器返回数据的格式与Ember Data建议的首选格式有几点不同。
这是原始JSON输出
{
"video": {
"uuid": "8a660002-03c6-4b8e-bd8b-4ce28fa0dacd",
"state": "pending",
"theme": "basic",
"resolution": "nHD",
"title": "Test title",
"track": {
"uuid": "376fc3bb-d703-49e7-9d92-bce7f6bf8b56",
"state": "complete",
"source": "upload"
}
}
}
首先,不是使用ID而是使用UUID作为字符串。
我似乎设法使用normalizeHash来修复它,至少对于视频 - 但我不确定相同的方法是否也会修复轨道模型 - 特别是如果我根据需要使用嵌入。
这就是大问题开始出现的地方,如果我从视频模型中注释掉belongsTo关系然后它工作正常,那么我认为......这显然是嵌入式跟踪数据的JSON格式的问题。
以下是模型定义和序列化
App.Video = DS.Model.extend({
title: DS.attr('string'),
//track: DS.belongsTo('track', { embedded: true })
});
App.VideoSerializer = DS.RESTSerializer.extend({
normalizeHash: {
video: function(hash) {
hash.id = hash.uuid;
delete hash.uuid;
return hash;
}
}
});
我非常感谢有关如何将此响应格式化为Ember Data识别的格式的建议。
此外 - 有没有人知道调试这些序列化转换的工具或好方法,因为目前来自Ember的错误消息在调试或查看序列化输出方面不是很有用。
非常感谢您提出的任何建议。
克里斯
答案 0 :(得分:4)
如果其他人对序列化有同样的困惑,我想我会解释如何解决这个问题。
这是工作的jsbin:
要点是:
主键
primaryKey: 'uuid'
将id转换为正确的命名和放大器非常有用。需要明确地应用于任何序列化程序(在ApplicationSerializer上全局使用似乎不起作用)。
模型关系
track: DS.belongsTo('track', {embedded: true} )
确保关系的定义包括嵌入&只在一边。
提取单个
extractSingle: function(store, type, payload, id, requestType) {
var tracks = [];
var track = payload.video.track;
var video = payload.video;
tracks.push(track);
video.track = payload.video.track.uuid;
payload = { video: video, track: tracks };
return this._super(store, type, payload, id, requestType);
}
即使模型关系是belongsTo,多元化对Ember Data理解关系也非常重要。
您可以在所需的(工作)JSON中清楚地看到这一点
{
"video": {
"id": "8a660002-03c6-4b8e-bd8b-4ce28fa0dacd",
"state": "pending",
"theme": "basic",
"resolution": "nHD",
"title": "Test title",
"track": "2"
},
"track": [{
"id": "2",
"state": "complete",
"source": "upload"
}]
}
视频中的曲目值不是包装在数组中,但根曲目值 是一个数组。
出于这个原因,我发现首先定义所需的JSON并首先测试它是否非常有用,然后尝试将真正的JSON转换为该格式。
我认为一个帮助这个过程的工具(通过seraliziation可视化实时JSON输出)可能是Ember Data& amp;我将考虑创作的东西。