JSON命名约定


379

JSON命名是否有标准?我看到大多数示例都使用下划线(lower_case)分隔的所有小写字母。但是,可以使用PascalCase或camelCase吗?


12
我很好奇某些行业领导者的选择。Twitter和Facebook API使用snake_case,而Microsoft和Google使用camelCase。
贾斯汀

2
@Justin是因为Twitter使用Ruby,而Facebook使用PHP。Ruby和PHP进入了snake_case。Microsoft和Google分别很好地使用C / .NET和Java。哦,是的,.net和Java可能已经加入了camelCase。一切都与编程语言的约定有关
Abel Callejo

1
没有标准,但是惯例似乎是使用接收系统技术的标准。
Hessle的马丁,

1
一切都是正确的,JSON中没有严格的名称/键约定。但是,我强烈建议避免kebab-case,因为它无法通过javascript中的dot(。)表示法访问,而必须使用array []表示法访问,我认为这很乏味。
萨拉巴'19

2
以主要基于意见而关闭?OP正在询问有关格式功能/限制的事实,而不是征求任何人的意见。他说“可以”,而不是“应该”。也许OP对这五个人的措词不够清晰,但是您必须具有相当差的阅读理解力才能不理解他的要求。
dynamichael

Answers:


251

目前尚无SINGLE标准,但我看到了您提到的3种样式(“ Pascal / Microsoft”,“ Java”(camelCase)和“ C”(下划线,snake_case))以及至少另外一种样式,kebab-case例如longer-name)。

这似乎主要取决于所讨论的服务的背景开发人员。具有c / c ++背景(或采用类似命名的语言,包括许多脚本语言,ruby等)的人通常选择下划线变体;其余的都类似(Java与.NET)。例如,提到的Jackson库假定Java bean命名约定(camelCase

更新:我对“标准”的定义是一个单一的约定。因此,尽管可以说“是的,但有很多标准”,但对我来说却有很多Naming Conventions,但总体上没有一个是“ The”标准。其中之一可以被视为特定平台的标准,但是考虑到JSON用于平台之间的互操作性,这可能有意义也可能没有意义。


4
坚持开发人员的背景很重要,但是JSON坚持Javascript标准。您的第一句话不太正确。但是一定要遵守团队的命名约定。
Anubian Noob 2015年

8
看到一些统计数据会很有趣,因为声称JSON和Javascript之间的联系的人们(不仅是历史遗产)与那些认为当前几乎没有将JSON与Javascript连接的人们之间一直存在摩擦。我属于后者。但我会对了解相对使用模式感兴趣。
StaxMan

@StaxMan C#在大多数情况下使用PascalCase,而不是camelCase。
ArtOfCode '16

@ArtOfCode是的。你的观点是什么?(也称为pascal案,有时也称为“上骆驼案”)
StaxMan

@StaxMan您是否考虑更新您的答案,以提及《 Google风格指南》
garrettmac

402

在本文档中,Google JSON样式指南(关于在Google上构建JSON API的建议),

它建议:

  1. 属性名称必须为camelCased ASCII字符串。

  2. 第一个字符必须是字母,下划线(_)或美元符号($)。

例:

{
  "thisPropertyIsAnIdentifier": "identifier value"
}

我的团队遵循此约定。


8
显然Google已经更改了指南,在文档中找不到关于骆驼案或以字母,_或$开头的任何内容……
TheEye 2014年

32
@TheEye它仍然存在,您只需要单击下拉列表。
gdw2 2014年

5
好眼睛,@ gdw2。对于以后的其他人,如果您单击旁边的箭头按钮Property Name Guidelines->Property Name Format->Choose meaningful property names.
Panzercrisis 2014年

3
有人可以解释为什么以及何时使用下划线为属性名称添加前缀吗?引用将是有用的,而不仅仅是意见。
肖恩·格洛弗

4
引用Google并不是一个恰当的答案。它们仅支持特定的约定/准则,并且看起来很像Java,因为它们非常面向Java。
ThomasAndreèWang

185

前提

在JSON键没有标准的命名。根据规范的“ 对象”部分:

JSON语法不对用作名称的字符串施加任何限制,...

这意味着camelCasesnake_case应该可以正常工作。

驱动因素

实施JSON命名约定非常令人困惑。但是,如果将其分解为多个组件,则很容易解决。

  1. 生成JSON的编程语言

    • Python-snake_case
    • PHP-snake_case
    • Java-camelCase
    • JavaScript-camelCase
  2. JSON本身没有标准的密钥命名

  3. 解析JSON的编程语言

    • Python-snake_case
    • PHP-snake_case
    • Java-camelCase
    • JavaScript-camelCase

混合搭配成分

  1. Python »JSON» Python - snake_case-一致
  2. Python »JSON» PHP - snake_case-一致
  3. Python »JSON» Java - snake_case-请参阅下面的Java问题
  4. Python »JSON» JavaScript - snake_case将很有意义;无论如何都要拧紧前端
  5. Python »JSON»您不知道-snake_case会有意义;反正拧紧解析器
  6. PHP »JSON» Python - snake_case-一致
  7. PHP »JSON» PHP - snake_case-一致
  8. PHP »JSON» Java - snake_case-请参阅下面的Java问题
  9. PHP »JSON» JavaScript - snake_case很有意义;无论如何都要拧紧前端
  10. PHP »JSON»您不知道-snake_case会有意义;反正拧紧解析器
  11. Java »JSON» Python - snake_case-请参阅下面的Java问题
  12. Java »JSON» PHP - snake_case-请参阅下面的Java问题
  13. Java »JSON» Java - camelCase-一致
  14. Java »JSON» JavaScript - camelCase-一致
  15. Java »JSON»您不知道-camelCase会有意义;反正拧紧解析器
  16. JavaScript »JSON» Python - snake_case很有意义;无论如何都要拧紧前端
  17. JavaScript »JSON» PHP - snake_case很有意义;无论如何都要拧紧前端
  18. JavaScript »JSON» Java - camelCase-一致
  19. JavaScript »JSON» JavaScript - camelCase-原始

Java问题

对于具有Java条目的人来说,snake_case仍然有意义,因为Java的现有JSON库仅使用访问密钥的方法,而不是使用标准的dot.syntax。这意味着与其他可以执行dot.syntax的编程语言相比,Java访问snake_cased键不会有多大伤害。

Java 示例org.json

JsonObject.getString("snake_cased_key")

Java 示例com.google.gson

JsonElement.getAsString("snake_cased_key")

一些实际的实现

结论

为JSON实现选择正确的JSON命名约定取决于您的技术堆栈。在某些情况下,可以使用snake_casecamelCase或任何其他命名约定。

要考虑的另一件事是JSON生成器与JSON解析器和/或前端JavaScript的权重。通常,应该将更多的权重放在JSON生成器端,而不是JSON解析器端。这是因为业务逻辑通常位于JSON生成器端。

另外,如果JSON解析器端未知,则可以声明对您有用的内容。


2
"Person":不是camelCase :)
2013年

1
@stoft可能是因为它们也遵循schema.org的约定。以大写字母开头的密钥意味着它是一个词汇实体。以小写字母开头的键意味着这是一个词汇表属性。
Abel Callejo

2
我不同意这些想法,只是因为Python后端> Java前端应该是camelCase,但是随后添加Python前端,却损害了后端和一个前端。它应该是后端如何按照“标准”进行处理。前端解析器无论如何都更容易适应
Bojan Kogoj '18

2
我在这里的关注点是引用了“您的技术”堆栈。JSON的生产者(尤其是由HTTP服务器提供服务的生产者)应该不知道是谁,什么消费它或出于什么原因。如果将JSON用作许多生产者和消费者之间的通信方法,则不应考虑生产者的技术堆栈。
罗比·韦勒姆

1
@RobbieWareham我对此有些同意。这里的问题是“按标准”没有正式的命名约定。因此,也许应该选择“事实上”来考察技术堆栈。我认为研究技术堆栈是最好的方法。看一下facebook,他们在历史上是否尊重JavaScript并且使用snakeCase?不!他们选择坚持使用PHP的snake_case。
亚伯·卡莱霍

18

对于NodeJS来说,特别是对我而言,如果我正在使用数据库并且字段名用下划线分隔,那么我也将它们用在struct键中。

这是因为db字段具有许多首字母缩写词/缩写,因此appSNSInterfaceRRTest之类的内容看起来有些混乱,但是app_sns_interface_rr_test更好。

在Javascript中,变量都是camelCase,而类名(构造函数)都是ProperCase,因此您会看到类似

var devTask = {
        task_id: 120,
        store_id: 2118,
        task_name: 'generalLedger'
    };

要么

generalLedgerTask = new GeneralLedgerTask( devTask );

当然,在JSON中,键/字符串用双引号引起来,但是您只需要使用JSON.stringify并传入JS对象即可,因此不必担心。

我为此作了一些努力,直到找到介于JSON和JS命名约定之间的这种愉快的媒介。


1
同样在这里。在Android客户端使用snake_case接收JSON看起来很尴尬!另外,数据库不会区分列名称的大小写,因此snake_case似乎最适合数据库。
mythicalcoder

@mythicalcoder Java中的JSON不是其核心。Java只使用解析Java的如外部包org.jsongson。接收snake_case数据不会像这样伤害那么大……JSONObject.get('snake_case_key_here')
Abel Callejo,



0

正如其他人所说,没有标准,因此您应该自己选择一个。这样做时需要考虑以下几点:

  1. 如果您使用JavaScript来使用JSON,则对两者的属性使用相同的命名约定将提供视觉一致性,并可能提供一些机会使代码更清晰地重用。

  2. 避免出现kebab-case的一个小原因是连字符可能与-值中出现的字符在视觉上发生冲突。

    {
      "bank-balance": -10
    }

1
snake_case使用下划线而不是破折号。
percebus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.