我正在努力将我的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"
        }
    }
}

第一个是,它使用字符串形式的UUID而不是使用ID。

我似乎已经设法使用normalizeHash至少针对视频进行了修复-但我不确定是否也可以使用相同的方法来修复轨道模型-特别是如果我根据需要使用嵌入的话。

这是开始出现大问题的地方,如果我从视频模型中注释掉EmiratesTo关系,那么它工作正常,所以我认为...显然,这是嵌入式轨道数据的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发出的错误消息对于调试或查看序列化输出是不是很有帮助。

非常感谢您提出的任何帮助。

克里斯

最佳答案

万一其他人对序列化有同样的困惑,我想我会附上一个解释如何解决这个问题的说明。

这是工作的jsbin:

http://jsbin.com/fuzu/4

要点如下:

主键

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压缩为该格式非常有用。

我认为有一个工具可以帮助此过程(可视化来自序列化的实时JSON输出)可能是Ember Data的重要补充,也是我将要研究的东西。

10-05 21:08
查看更多