YAML vs. JSON: 有什么区别?

2,536 阅读9分钟

YAML vs. JSON: What is the difference?

JSON和YAML是两种流行的格式,用于不同应用程序和语言之间的数据交换,也被称为数据序列化

它们在功能和特点上是相似的:它们表示数据对象和结构,使用简单的语法,便于阅读和编辑。

但设计上的差异影响了它们的使用范围。这篇关于YAML和JSON的概述将展示它们的主要特点并对它们进行比较,以帮助你为你的项目做出正确的选择。

目录

什么是JSON
JSON历史
技术规格
JSON使用的数据类型
语法
JSON示例
➤ JSON 的优点
➤ JSON的缺点
什么是YAML
➤ YAM L历史
技术规格
数据类型
语法
YAML示例
➤ YAML 的优点
➤ YAML的缺点
JSON和YAML的区别
YAML和JSON:哪个更好?

什么是 JSON

JSON是指JavaScript对象符号。正如你可能从名字中猜到的那样,JSON 源自 JavaScript 数据格式。它是一种开放标准、轻量级、基于文本的格式,数据类型有限。它简短的语法和简单的结构使它非常容易阅读。

它被用来向服务器发送数据,以及从服务器向客户端发送数据,就像一个信封,数据被包裹在其中,在通信者之间来回发送。

它受到程序员的高度赞赏,他们在移动应用程序、MongoDB或Kubernetes等数据库服务和用户互动中使用它,是XML的一个更友好的替代品。JSON提供的简单性和处理速度,以及它与任何系统的高兼容性,使它成为当今最流行的格式之一。

JSON的历史

根据JSON的开发者Douglas Crockford的说法,1996年网景公司就已经在使用相同原理的语言了,但JSON在2001年才作为一种成熟的语法成为主流。

它是Android技术、REST-API或任何将数据从服务器发送到网页的情况下的首选资源。它是独立于语言的,这意味着它可以与任何编程语言一起使用。而我们在线体验的很大一部分都依赖于它。

技术规格

JSON文件的决定性特征是什么?JSON文件的扩展名被定义为.json。它使用通用数据结构和有限的数据类型选择。它的简单语法使用了C-家族语言的程序员所熟悉的惯例,如C、C++、C#、Java、JavaScript、Perl、Python等。正如JSON的官方网站所解释的。

"一个对象是一个无序的名/值对的集合。一个对象以**{左括号开始,以}右括号结束。每个名字后面都有:冒号**,名字/值对之间用**,逗号**分开。"

JSON使用的数据类型

  • 字符串
  • 数字
  • 对象
  • 数组
  • 布尔值(真/假)
  • 空值

语法

JSON的语法规则很简单:

  • 根节点必须是一个数组或一个对象。
  • 数据被指定为名/值对。
  • 数据条目由逗号分隔。
  • 对象被限制在大括号之间。
  • 方括号容纳数组。
  • 对象可以有数组对象来创建列表。
  • 它在名字和值周围使用引号,用冒号分开。

JSON例子

让我们看一个JSON例子,使用一些关于著名重金属乐队Metallica的信息:

{
  "bandName": "Metallica",
  "genre": "Heavy Metal",
  "active": "yes",
  "bandMembers": {
    "drums": "Lars Ulrich",
    "guitarLead": "Kirk Hammet",
    "guitarRythm": "James Hetfield",
    "bass": "Cliff Burton"
  },
  "otherMembers": ["Jason Newsted",
    "Robert Trujillo",
    "Dave Mustaine",
    "Ron McGovney"
  ],
  "Discography" : [
    {"name":"Kill ’Em All","year":"1983"},
    {"name":"Ride the Lightning","year":"“1984"},
    {"name":"Master of Puppets","year":"“1986"},
    {"name":"..And Justice for All","year":"“1988"}
  ]
}

正如你所看到的,大括号限定了对象和数组。所有项目都有引号,属性名称和值用冒号分开。逗号用于分隔名称:值的配对。

列表是通过使用方括号定义的,其中的数组属性也用逗号隔开。

JSON的优点

  • 其紧凑的语法使JSON非常便于人类阅读。
  • 语法简单,标记有限。
  • 被系统和语言快速解析。
  • 它可以被大多数系统和语言所使用。

JSON的劣势

  • 有限的数据类型:只接受字符串、数字、JSON对象、数组、布尔值和空。
  • 不接受:命名空间、注释或属性。
  • JSON的结构是为了简单,所以它可能不支持自己的复杂配置。

什么是YAML

YAML的意思是 "另一种标记语言",但这个意思变成了YAML Ain't Markup Language,以表达它对数据的关注超过对文档的关注。撇开缩写不谈,YAML是一种非常人可读的轻量级格式,通常用于存储DevOps工具的配置信息,如ElasticSearchDockerKubernetesPrometheusAnsible

就像它在官方网站上说的,也是用YAML格式写的:

"YAML是一种人类友好的数据序列化语言,适用于所有编程语言"。

它是一种数据序列化语言,但它也经常被用来编写配置文件。我们将通过数据序列化的棱镜来观察YAML。

YAML的历史

YAML在2001年首次被公开。YAML的创始者是IngydotNet、Clark Evans和Oren Ben-Kiki,他们共同致力于创造一种比XML更简单的格式。你可以从第一手资料的角度来阅读这个故事。 从那时起,它已经成为各地开发者的工作主力。

技术规格

YAML是以一种非常清晰的人类可读的格式编写的,它的额外优势是支持注释,使得它超级容易编辑。 因为它是JSON的超集,所以一个有效的YAML文件可以包含JSON对象。它适合于支持复杂的数据类型,能够包围多层次的对象。这使得它对某些技术的使用不那么友好。

数据类型

YAML接受与JSON相同的数据类型,主要区别在于支持日期属性的能力:

  • 字符串
  • 数字
  • 布尔型
  • 日期和时间戳
  • 序列
  • 嵌套值
  • 空值

语法

大多数函数没有括号和引号,这使得阅读更加自然。即使是不熟悉的人也能迅速了解应该发生什么。YAML的语法是它的优势,但如果我们不注意缩进和空格的位置,也是验证问题的来源。

  • 使用键值对,用冒号分隔。
  • 弹簧不包含在括号中。
  • 缩进是用来定义数据层次的。
  • 列表以连字符开始。
  • 允许在注释前面加上#。
  • 属性前的空格很重要。
  • 管状字符(|)允许多行字符串;"大于 "符号(>)允许将多行字符串作为单行阅读。
  • YAML可以通过使用"&"来引用其他数据对象。

YAML示例

现在,看看我们上面用于JSON的相同数据在YAML格式中的样子:

bandName: Metallica
genre: Heavy Metal
active: 'yes'

bandMembers:
  drums: Lars Ulrich
  guitarLead: Kirk Hammet
  guitarRythm: James Hetfield
  bass: Cliff Burton
  
otherMembers:
  - Jason Newsted
  - Robert Trujillo
  - Dave Mustaine
  - Ron McGovney
  
Discography:
  - name: Kill ’Em All
    year: '1983'
  - name: Ride the Lightning
    year: “1984
  - name: Master of Puppets
    year: “1986
  - name: ..And Justice for All
    year: “1988

第一印象,YAML看起来比JSON好,因为它摆脱了所有的括号和引号。它读起来不太像代码,而更像一个大纲。

YAML的优点

  • 非常简单的人类可读的语法。
  • 紧凑的语法,使用Python风格的缩进来表示结构。
  • 支持int、binary、str和bool等标度器,以及map、set、pair和seq等集合。
  • YAML支持JSON所不支持的注释。只需在注释前添加一个#符号。
  • 能够使用复杂的数据结构。
  • 通过使用"&"符号,YAML可以重复使用块。这也是它被用来描述基础设施的原因之一,比如Kubernetes堆栈。JSON没有相应的操作。

YAML的劣势

  • 不正确的缩进或间距容易产生验证错误。
  • YAML的声明性使得调试更加困难:挪威的Alpha码(NO)可以被解释为一个布尔值。
  • 没有断点。

JSON和YAML之间的区别

YAML和JSON是两种流行的语言,在结构和可用性方面很相似。它们在设计、语法和功能上的差异使它们之间的选择成为一个目的问题。

JSON YAML

语法

容易阅读,虽然有括号、逗号和引号。

比JSON更容易阅读,但有时会导致属性值的误读。

层次结构

通过关联数组和列表支持简单层次结构。

明确支持对象引用和关系树。

复杂度

简单的数据类型和结构。

有可能拥有复杂的数据结构,有更复杂的数据类型可用。

性能

更快的生成和解析。

更复杂的数据结构会降低解析速度。

支持

活跃、参与的社区、许多可用的库。

比JSON更小的社区,这意味着更少的库和支持。

功能

它的本地功能比YAML少,这遏制了数据串行化的复杂性。

对于复杂的数据序列化来说更加有趣。

YAML和JSON:哪个更好?

在选择JSON或YAML时,只要按照函数即可。你需要它们做什么?

JSON具有更快的交付速度,因为它作为一种简单的数据交换格式可以完美运行。但是它仅限于支持的数据类型,这可能需要额外的资源来处理具有更多数据类型选项的数据集。一旦你克服了括号和引号,它就很容易阅读,这是一个优势,因为它们限定了特定的项目,减少了解析误解的风险。

YAML,另一方面,几乎读起来不像是代码。而类似于matryoshka的在对象中包含对象的能力允许更大的数据复杂性。缺点是什么?这种复杂性会减慢解析和生成过程。但由于有一系列复杂的数据类型可用,它有其吸引力,是扩大可用信息类型的一个很好的选择。

要传递的信息的目的和优先级也很重要,在开始编码之前应定义一个逻辑层次结构。这之前的组织将定义文档的结构以及数据的呈现方式。

无论选择哪种方式,都是关于你的数据最终应该做什么。