JSONAPI 的 Dasherize 属性

Dasherize properties for JSONAPI

我的 drf 后端有这个模型:

class Product:

    price_range = ...

我将 EmberData 与 JSONApi 序列化程序一起使用。我刚刚发现 JSON API 需要破折号属性。所以我需要告诉 drf:

JSON_API_FORMAT_KEYS = 'dasherize'

并且 属性 在 JSON 中被序列化为:

price-range

然后,EmberData开始跳舞,我得到了 Ember 模型 属性:

import DS from 'ember-data';

export default DS.Model.extend({
    ...
    priceRange: DS.attr('number'),
    ...
});

(旧的 RESTSerializer 期待 JSON 中的 priceRange,如果我没记错的话)

所以,我们从 price_range -> price-range -> priceRange 开始(如果你问我这很疯狂)。我通过反复试验发现了这一切。对于 drf,相应的设置记录在 here.

JSONApiEmberDataEmber 的记录在哪里?我想确保我真的理解了这一点,而且人际关系也是如此。相关的 drf 配置设置为:

JSON_API_FORMAT_RELATION_KEYS = 'dasherize'

blog post for the Ember-Data 1.13 release 中,Ember 数据团队写道:

JSONSerializer and RESTSerializer have been refactored and streamlined to return JSON API payloads.

这意味着向前推进 Ember 数据需要符合 JSON API 的破折号名称。见 the JSON API recommendation for dashes in between words of member names:

Member names SHOULD contain only the characters "a-z" (U+0061 to U+007A), "0-9" (U+0030 to U+0039), and the hyphen minus (U+002D HYPHEN-MINUS, "-") as separator between multiple words.

并查看 JSON API 主页上的一些示例 JSON:

-"attributes": {
    "first-name": "Dan",
    "last-name": "Gebhardt",
    "twitter": "dgeb"
},

就模型而言,the most recent documentation for Ember 2.2.0 声明:

In Ember Data the convention is to camelize attribute names on a model

并且带有 mutli-world 属性名称的示例模型符合预期:

export default DS.Model.extend({
  firstName: DS.attr('string'),
  lastName:  DS.attr('string'),

  isPersonOfTheYear: DS.attr('boolean')
});

虽然推荐的命名约定中肯定有改动,但我预计此时大部分这些更改都已经过去了。核心团队已经注意到了。我相信围绕 JSON API 进行标准化的举措,以便可以构建 inter-operable 和 re-usable 工具,但不幸的是,这一举措伴随着这些变化而来。

总结:在您的 JSON 中使用破折号名称,在您的模型中使用驼峰名称。

编辑: 似乎 Ember 数据团队采纳了 JSON API 关于 JSON 负载中的 属性 名称的建议,但这只是一个建议。请参阅 GitHub regarding the dasherized naming convention 上关于 JSON API.

的讨论