使用最新Ember Data版本中的RESTSerializer格式化JSON

时间:2014-02-07 17:46:00

标签: javascript json serialization ember.js ember-data

我正努力将我的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的错误消息在调试或查看序列化输出方面不是很有用。

非常感谢您提出的任何建议。

克里斯

1 个答案:

答案 0 :(得分:4)

如果其他人对序列化有同样的困惑,我想我会解释如何解决这个问题。

这是工作的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转换为该格式。

我认为一个帮助这个过程的工具(通过seraliziation可视化实时JSON输出)可能是Ember Data& amp;我将考虑创作的东西。