JSON命名规范(snake_case, camelCase或PascalCase)

JSON命名有标准吗?我看到大多数例子都用下划线分隔的小写字母,也就是snake_case,但它也可以用PascalCasecamelCase吗?

463363 次浏览

似乎有足够多的变化,人们可以允许从所有约定转换为其他约定:http://www.cowtowncoder.com/blog/archives/cat_json.html

值得注意的是,上面提到的Jackson JSON解析器更倾向于bean_naming

没有单一的标准,但我见过你提到的3种风格(“Pascal/Microsoft”,“Java”(camelCase)和“C”(下划线,snake_case))——以及至少一种,kebab-case,如longer-name)。

这似乎主要取决于相关服务的开发人员的背景;那些有c/c++背景的人(或采用类似命名的语言,包括许多脚本语言,ruby等)通常选择下划线变体;和rest相似(Java vs . net)。例如,上面提到的Jackson库采用Java bean命名约定(camelCase)

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

在本文档谷歌JSON样式指南(在谷歌构建JSON api的建议)中,

它建议:

  1. 属性名必须是camelCased, ASCII字符串。

  2. 首字符必须为字母、下划线(_)或美元符号($)。

例子:

{
"thisPropertyIsAnIdentifier": "identifier value"
}

我的团队在构建REST api时始终遵循这个约定。原因如下:

  • 首先,JSON约定应该独立于编程语言,因为我们希望api保持一致,不管有些api是使用camelCase语言实现的(例如Java),有些api是使用snake_case语言实现的(例如Python)。
  • 此外,我们的大多数客户端都是web应用程序,所以camelCase是首选
  • 如果客户端更喜欢snake_case,它仍然可以轻松地在snake_casecamelCase之间转换数据(在库的帮助下)

但是我同意,如果所有的应用程序都使用相同类型的语言(例如snake_case),那么JSON约定也应该遵循。

特别是对于我在NodeJS上,如果我使用数据库,我的字段名是下划线分隔的,我也在结构键中使用它们。

这是因为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命名约定之间找到了这个愉快的媒介。

ECMA-404

JSON语法对用作名称的字符串没有任何限制,…

JSON中的键有没有标准命名,camelCasesnake_case应该可以正常工作。

博士TL;

这里有一个rule-of-a-thumb,我认为大多数开发人员都使用它。

技术堆栈 命名约定 原因/ # EYZ0
# eyz0»json»# eyz0 snake_case 一致
# eyz0»json»# eyz1 snake_case 一致
# eyz0»json»# eyz1 snake_case或camelCase 依赖于业务逻辑所在的位置。利用Java的外部风格。
Python»JSON»后端JavaScript snake_case或camelCase 依赖于业务逻辑所在的位置。
Python»JSON»前端JavaScript snake_case 别管前端了
# eyz0»json»# eyz1 snake_case 不管怎样,去他的解析器
# eyz0»json»# eyz1 snake_case 一致
# eyz0»json»# eyz0 snake_case 一致
# eyz0»json»# eyz1 snake_case或camelCase 依赖于业务逻辑所在的位置。利用Java的外部风格。
PHP»JSON»后端JavaScript snake_case或camelCase 依赖于业务逻辑所在的位置。
PHP»JSON»前端JavaScript snake_case 别管前端了
# eyz0»json»# eyz1 snake_case 不管怎样,去他的解析器
# eyz0»json»# eyz1 camelCase或snake_case 依赖于业务逻辑所在的位置。利用Java的外部风格。
# eyz0»json»# eyz1 camelCase或snake_case 依赖于业务逻辑所在的位置。利用Java的外部风格。
# eyz0»json»# eyz0 camelCase 一致
# eyz0»json»# eyz1 camelCase 一致
# eyz0»json»# eyz1 camelCase 不管怎样,去他的解析器
后端JavaScript»JSON»Python camelCase或snake_case 依赖于业务逻辑所在的位置。
前端JavaScript»JSON»Python snake_case 别管前端了
后端JavaScript»JSON»PHP camelCase或snake_case 依赖于业务逻辑所在的位置。
前端JavaScript»JSON»PHP snake_case 别管前端了
# eyz0»json»# eyz1 camelCase 一致
# eyz0»json»# eyz0 camelCase 原始
# eyz0»json»# eyz1 camelCase 不管怎样,去他的解析器
< / div > # EYZ0

强加命名约定非常令人困惑,因为JSON本身并没有强加标准。但是,如果将其分解为多个组件,就可以很容易地计算出这一点。

JSON发电机

编程语言 命名约定
Python snake_case
PHP snake_case
Java camelCase
JavaScript camelCase
< / div > # EYZ0
编程语言 命名约定
Python snake_case
PHP snake_case
Java camelCase
JavaScript camelCase
< / div > # EYZ0

您必须决定哪一方具有更重的业务逻辑,是JSON发电机一方还是JSON解析器一方?

自然的归属感

编程语言 自然的归属感
Python 内在
PHP 内在
Java 外在
JavaScript 内在

内在 -访问JSON的编程语言,自然相似访问本机对象和数组。

外在 -访问JSON而不是访问本机对象和数组的编程语言。下面是Javacom.google.gson包的一个例子:

/**
* Using a method to access a property instead of using the standard 'dot.syntax'
*/
JsonElement.getAsString("snake_cased_key");

一些实际的实现

  • # eyz0 - # eyz1
  • # eyz0 - # eyz1
  • 亚马逊网络服务 & snake_cased;# EYZ2
  • # eyz0 - # eyz1
  • # eyz0 - # eyz1

结论

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

另一件需要考虑的事情是json生成器与json解析器和/或前端JavaScript的权重。一般来说,应该把更多的重量放在业务逻辑方面。

此外,如果json解析器方面是未知的,那么您可以声明任何对您有用的东西。

我认为JSON没有官方的命名约定,但是您可以跟随一些行业领导者来了解它是如何工作的。

谷歌是世界上最大的IT公司之一,它有一个JSON风格指南:https://google.github.io/styleguide/jsoncstyleguide.xml

利用这一点,你可以找到谷歌定义的其他样式指南:https://github.com/google/styleguide

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

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

  2. 避免串式大小写的一个小原因是连字符可能在视觉上与值中出现的-字符冲突。

    {
    "bank-balance": -10
    }