YAML和JSON有什么区别?什么时候比较喜欢一个

pie*_*fou 673 json yaml

考虑到以下因素,我们何时应该优先使用YAML而不是JSON,反之亦然?

  • 性能(编码/解码时间)
  • 内存消耗
  • 表达清晰度
  • 库可用性,易用性(我更喜欢C)

我计划在嵌入式系统中使用这两个中的一个来存储配置文件.

有关:

我应该使用YAML或JSON来存储我的Perl数据吗?

And*_*dyL 618

从技术上讲,YAML是JSON的超集.这意味着,至少在理论上,YAML解析器可以理解JSON,但不一定相反.

请参阅标题为"YAML:与JSON的关系"的部分中的官方规范.

一般来说,我喜欢YAML中某些JSON中没有的东西.

  • 正如@jdupont指出的那样,YAML在视觉上更容易看.事实上,YAML主页本身就是有效的YAML,但人们很容易阅读.
  • YAML能够使用"锚点"引用YAML文件中的其他项目.因此,它可以处理MySQL数据库中可能找到的关系信息.
  • YAML YAML文件中嵌入其他序列化格式(如JSON或XML)更为强大.

实际上,最后两点都不会对你或我所做的事情产生影响,但从长远来看,我认为YAML将是一种更强大和可行的数据序列化格式.

目前,AJAX和其他Web技术倾向于使用JSON.YAML目前更多地用于离线数据处理.例如,它默认包含在基于C的OpenCV计算机视觉包中,而JSON则不包括在内.

您将找到JSON和YAML的C库.YAML的图书馆往往更新,但我过去没有遇到任何问题.参见例如Yaml-cpp.

  • json不是*子集(虽然它很接近),并且当你对它们进行封装时,不兼容性会令人愤怒.json库通常更快......(http://stackoverflow.com/questions/2451732/how-is-it-that-json-serialization-is-so-much-faster-than-yaml-serialization-in-p ).yaml支持者将坚持认为它是一个子集.如果可读性是一个问题,请使用yaml.如果需要考虑互操作性和速度,请使用JSON. (186认同)
  • YAML也支持方便的评论. (107认同)
  • 来自[YAML 1.2规范](http://www.yaml.org/spec/1.2/spec.html):"此修订的主要目标是使YAML符合JSON作为官方子集." (59认同)
  • @ErikAronesty JSON接近YAML 1.1的一个子集,但是从YAML 1.2开始,它现在是一个真正的子集.YAML 1.2主要是为了解决这两个规范之间的最后几个不兼容问题. (55认同)
  • YAML是特定形式的JSON语法的超集.也就是说,如果您以与YAML兼容的方式使用JSON,那么它就是一个合适的子集.正如Pierr在上面评论的那样,规范是[针对兼容性](ajaxian.com/archives/json-yaml-its-getting-closer-to-truth). (5认同)
  • @EvanBenn 1. json不是yaml的严格子集。json允许重复的键。yaml没有。如果有人决定反序列化为多图(看到它,去过那里),那么yaml根本不起作用。2.我警告说在必定更复杂的Yaml解析器中更容易出现错误 (3认同)
  • json 是 YAML 1.2 的子集吗,因为这个 cstring 不会在 yaml 中解析: "{\n\t\"abc\":\"xyz\"\n}" (2认同)

Eri*_*sty 183

区别:

  1. YAML,取决于您如何使用它,可以比JSON更具可读性
  2. JSON通常更快,并且可能仍然可以与更多系统互操作
  3. 可以非常快速地编写一个"足够好"的JSON解析器
  4. 重复键,这是潜在的有效的JSON,是绝对无效YAML.
  5. YAML有很多功能,包括评论和关系锚.因此,YAML语法非常复杂,并且很难理解.
  6. 可以在yaml:中编写递归结构{a: &b [*b]},它将在某些转换器中无限循环.即使使用循环检测,仍然可以使用"yaml炸弹"(参见xml炸弹).
  7. 因为没有引用,所以不可能在JSON中使用对象引用序列化复杂结构.因此,YAML序列化可以更有效.
  8. 在某些编码环境中,使用YAML可以允许攻击者执行任意代码.

观察:

  1. Python程序员通常是YAML的忠实粉丝,因为使用缩进而不是括号语法来指示级别.
  2. 许多程序员认为将"意义"作为缩进的依附是一个糟糕的选择.
  3. 如果数据格式将离开应用程序的环境,在UI中解析或在消息传递层中发送,则JSON可能是更好的选择.
  4. YAML可以直接用于语法定义等复杂任务,并且通常比发明新语言更好.

  • @SFEley YAML规范说可能有效的JSON文件是无效的YAML.但它不太可能实际使用."JSON的RFC4627要求映射键仅"应该"是唯一的,而YAML坚持认为它们"必须".从技术上讲,YAML符合JSON规范,选择将重复项视为错误.实际上,由于JSON是静默的这种重复的语义,唯一可移植的JSON文件是那些具有唯一键的文件,因此它们是有效的YAML文件." - http://www.yaml.org/spec/1.2/spec.html#id2759572 (31认同)
  • 它是.[Yaml 1.2](http://www.yaml.org/spec/1.2/spec.html)的全部目的是解决一些兼容性差异,使JSON成为严格的子集.如果您认为该规范没有实现其目的,Erik请指出一个有效JSON违反YAML规范和/或打破经过验证的1.2兼容YAML解析器的示例. (9认同)
  • 评论缩进的使用; 好吧,我相信可能需要习惯而不是每个人都喜欢它.例如,我是一个.NET人.我正在查看travis.yml文件,并想知道为什么会出现问题.我发现我有一个标签,它不是.由于空格/制表符/新行首选项,并非所有人都习惯了事情的爆发. (8认同)
  • 标签根本不允许作为缩进字符.恕我直言,这是所有语言的良好编码风格 - 有或没有句法缩进. (8认同)
  • @Wyrmwood我个人喜欢python和YAML,每天都会使用它们.我倾向于将YAML用于人们必须经常编辑的东西,而JSON则用于人们"可能"需要查看的东西.我一直受到C++开发者的有效批评,他们发现缩进令人困惑....特别是如果有多个级别或更长的功能块.当然......好的可测试代码没有那些东西,所以它通常不是问题.这是我个人的观察,但任何随意的谷歌搜索都会产生很多结果......所以验证它是微不足道的. (5认同)
  • 关于标签与空格的问题:https://medium.com/@hoffa/400-000-github-repositories-1-billion-files-14-terabytes-of-code-spaces-or-tabs-7cfe0b5dd7fd#. 6d7oakwad (3认同)
  • 你能扩展第三点吗?我以为是的. (2认同)
  • 有道理.(虽然不太可能在实践中出现,但这不是问题.)谢谢. (2认同)
  • 观察点 2 “许多程序员” - 这是一种无源的“鼬鼠”语言。找到一个来源并做出可量化的陈述或将其删除。 (2认同)

Jas*_*ing 79

绕过深奥的理论

这回答了标题,而不是详细信息,因为大多数人只是像谷歌一样从google搜索结果中读取标题,所以我觉得有必要从Web开发人员的角度进行解释.

  1. YAML使用空格缩进,这是Python开发人员熟悉的领域.
  2. JavaScript开发人员喜欢JSON,因为它是JavaScript的一个子集,可以直接在JavaScript中解释和编写,同时使用简写方式声明JSON,在使用没有空格的典型变量名时,不需要键中的双引号.
  3. 有很多解析器在YAML和JSON的所有语言中都能很好地工作.
  4. 在许多情况下,YAML的空白格式可以更容易查看,因为格式化需要更人性化的方法.
  5. 如果您的编辑器中没有空格可见或缩进线指示符,那么YAML的空白虽然更紧凑,更容易查看,但可能难以手动编辑.
  6. JSON的序列化和反序列化要快得多,因为要检查的功能明显少于YAML,这使得更小,更轻的代码能够处理JSON.
  7. 一个常见的误解是YAML需要较少的标点符号并且比JSON更紧凑,但这完全是错误的.空格是不可见的,所以看起来字符较少,但是如果你计算实际的空格是必要的,以便正确解释YAML以及正确的缩进,你会发现YAML实际上需要比JSON更多的字符.JSON不使用空格来表示层次结构或分组,并且可以通过删除不必要的空格来轻松展平,以实现更紧凑的传输.

房间里的大象:互联网本身

JavaScript如此明显地占据了网络的巨大优势,JavaScript开发人员更喜欢将JSON作为数据格式与流行的Web API一起使用,因此在进行一般意义上的Web编程时,很难使用YAML而不是JSON,因为您很可能会被淘汰在团队环境中.实际上,大多数Web程序员甚至都不知道YAML存在,更不用说考虑使用它了.

如果您正在进行任何Web编程,JSON是默认的方法,因为在使用JavaScript时不需要转换步骤,因此在这种情况下您必须提出更好的参数来使用YAML而不是JSON.

  • 我不同意python开发人员更喜欢YAML.Pythons dict是basicaly JSON,dicts列表也基本上是JSON.Python已经构建在json lib中.另外一点我是python开发人员,我更喜欢JSON(我认识的大多数python开发人员更喜欢JSON). (10认同)
  • @cmroanirgo呀这是我的经历.我的老板强迫我们使用YAML而不是JSON,这使编辑和摄取变得不必要.我写这篇是因为希望投票会证明我. (7认同)
  • 真正困扰我的关于白色空间的一件事就是容易混淆和弄错是多么容易,因为缩进或不合并意味着它的嵌套或同一级别,如果你不这样做也很容易出错有一个指导规则.它就像隐藏的oops一样,这真的不是那种简单的场景,没有人在编辑yaml时说.从来没有与json有过这个问题. (6认同)
  • @JasonSebring.你几乎想知道YAML为什么选择空间.我在YAML的第一次"在海洋中畅游"导致应用程序崩溃...所有这些都是因为空间.您可能认为使用不使用非打印字符的缩进可能会更有意义!(也就是说,为什么他们不选择'.'而不是''?)要理解YAML,你必须遵守规范.要理解JSON不需要它.(我去过前者,而不是后者).对我来说,这表示一种不是真正"人类可读"的格式 (6认同)
  • @HonoredMule 作为一个随机的 IT 人,他更经常破解事物而不是从头开始创建它们......人类可写就是人类可读,并且在多个 IDE 和平台上可读,而不用想知道空白是如何呈现的。对我来说,这使得所谓的人类天生可读性的空白变得一团糟。我又对眼了,废话。 (3认同)
  • @toolbear可以安全地使用JSON.parse(jsonString)而不是eval(jsonString) (2认同)
  • YAML中的选项卡出现问题意味着(a)无法阅读错误消息,并且(b)具有未突出显示选项卡的编辑器。这两个问题都很容易纠正,所以我不理解这些投诉。 (2认同)
  • @JasonSebring 啊,好吧,抱歉。在处理 Symfony 和 Docker 时,我只需要编辑大量 yaml。事实上,在前端我从未遇到过任何 yaml 配置。当开始使用 Symfony 时,我对 Yaml 也感到不舒服。但当在非前端环境中与 JSON 进行比较时——我个人认为 yaml 更令人愉快。 (2认同)

Ste*_*ett 34

这个问题是6岁,但奇怪的是,没有一个答案确实解决了所有四个方面(速度,记忆力,表现力,便携性).

速度

显然这是依赖于实现的,但是因为JSON被如此广泛地使用并且易于实现,所以它倾向于获得更大的本机支持,因此速度更快.考虑到YAML完成了JSON所做的一切,加上更多的卡车运载,很可能两者的任何类似实现,JSON都会更快.

然而,考虑到YAML文件可以稍微小于其对应的JSON(由于较少",字符),它可能是一个高度优化的YAML解析器可能会更快在特殊情况下.

记忆

基本上相同的论点适用.如果YAML解析器代表相同的数据结构,那么很难理解为什么YAML解析器比JSON解析器更有效.

表现

正如其他人所指出的,Python程序员倾向于选择YAML,JavaScript程序员转向JSON.我会做出这些观察:

  • 记住JSON的整个语法很容易,因此对理解任何JSON文件的含义非常有信心.任何人都无法真正理解YAML.细微之处和边缘情况的数量是极端的.
  • 由于很少有解析器实现整个规范,因此更难确定给定上下文中给定表达式的含义.
  • 在实践中,JSON缺乏评论是一个真正的痛苦.

可移植性

很难想象没有JSON库的现代语言.也很难想象一个JSON解析器实现的东西比完整规范少.YAML得到了广泛的支持,但不如JSON普遍存在,并且每个解析器都实现了不同的子集.因此,YAML文件的可互操作性低于您的想象.

摘要

JSON是性能(如果相关)和互操作性的赢家.YAML更适合人工维护的文件.虽然可移植性大大降低,但HJSON是一个不错的折衷方案.JSON5是一种更合理的折衷方案,语法定义明确.

  • 我觉得这里的答案都没有明确说明:“对于设置/配置文件,YAML 更好(出于上述每个人提到的原因)。对于机器/机器互操作使用 JSON”。换句话说:如果你的目标受众是人类,YAML 更好。如果目标是另一个程序(但您仍然希望数据是人类可读的),请使用 JSON。 (4认同)
  • 我实际上认为YAML较小,因为隐形角色愚弄了我.隐形=>不存在,实际上不存在.如果计算必须存在的不可见字符,尤其是当YAML获得更大的嵌套时,它会快速超过JSON.我只是觉得这很有趣,因为人类可读的部分让我们大多数人都陷入了这个想法,直到我真的想到它,因为你可以压扁JSON和YAML,而不是那么多.我还发现YAML非常难以手动编辑,不能阅读,只需编辑,因为您需要打开编辑器指南,有时容易误认为嵌套项目. (3认同)

Joh*_*nAD 25

GIT和YAML

其他答案都很好.先读一下.但我有时会添加另一个使用YAML的理由:git.

越来越多的编程项目使用git存储库进行分发和归档.而且,虽然git repo的历史记录可以同样存储JSON和YAML文件,但用于跟踪和显示文件更改的"diff"方法是面向行的.由于YAML被强制为面向行,因此人类更容易看到YAML文件中的任何小变化.

当然,通过对字符串/键进行排序并添加缩进,可以使JSON文件"变得漂亮".但这不是默认值而且我很懒.

就个人而言,我通常使用JSON进行系统到系统的交互.我经常使用YAML来配置文件,静态文件和跟踪文件.(我通常也会避免添加YAML关系锚.生命太短,无法追捕循环.)

此外,如果速度和空间真的是一个问题,我也不使用.你可能想看看BSON.

  • YAML 如果经常编译为 JSON,尤其是在使用 git 时。例如,在 GitHub Actions 中,需要一个“.workflow.yml”文件来定义工作流程,但它在运行时只会被编译为 JSON (2认同)

jld*_*ont 22

我发现YAML在眼睛上更容易:更少的括号,""等等.尽管YAML中有标签的烦恼......但是人们可以了解它.

在性能/资源方面,我不希望两者之间存在很大差异.

此外,我们正在谈论配置文件,所以我不期望高频率的编码/解码活动,不是吗?

  • 我想知道你的意思是什么*标签的烦恼*.我相信事情是[标签字符不允许在yaml](http://www.yaml.org/faq.html),我个人认为[在任何源文件中都是个好主意](http:// www .jwz.org/DOC /选项卡-VS-spaces.html). (21认同)
  • 好的,但他们不是标签. (8认同)
  • @poolie:jldupont可能是指在YAML中[语法上重要的领先空白](http://c2.com/cgi/wiki?SyntacticallySignificantWhitespaceConsideredHarmful). (5认同)

小智 19

如果您不需要YAML具有的任何功能而JSON没有,我更喜欢JSON,因为它非常简单并得到广泛支持(在许多语言中有很多库).YAML更复杂,支持更少.我不认为解析速度或内存使用会有很大差异,也许并不是程序性能的重要部分.

  • 例如,YAML支持锚点,如另一个答案中所述.还有其他功能,例如可扩展数据类型.这使得解析变得更加复杂,并解释了为什么YAML具有更大的规范.根据解析器的实现,它可能会损害性能(请看一下这个问题:http://stackoverflow.com/questions/2451732/how-is-it-that-json-serialization-is-so-much-faster-than- YAML序列化-IN-p). (18认同)
  • 复杂性优于简单性,如果这种复杂性能够为您提供实现整体更大简单性的能力.这肯定是正确的,具体取决于数据模型的复杂性. (5认同)
  • YAML哪个方面更复杂? (3认同)
  • 我可能在这里有点晚,但YAML可以添加注释,而JSON不能.对我来说,这对规范文档来说是一个很大的帮助 (3认同)
  • @Accatyyc。我认为人们在这里询问有关差异的问题的事实是*肯定* 标志 YAML 并不是那么容易。我*从未*问过有关 JSON 的问题(除了“为什么我不能在其中添加评论?”) (2认同)

Wer*_*ght 12

从技术上讲,YAML提供的不仅仅是JSON (YAML v1.2是JSON的超集):

  • 评论
  • 锚点和继承 - 3个相同项目的示例:

    item1: &anchor_name
      name: Test
      title: Test title
    item2: *anchor_name
    item3:
      <<: *anchor_name
      # You may add extra stuff.
    
    Run Code Online (Sandbox Code Playgroud)
  • ...

大多数时候人们不会使用这些额外功能,主要区别在于YAML使用缩进JSON使用括号.这使得YAML更加简洁和可读(对于训练有素的眼睛).

哪一个选择?

  • YAML额外功能和简洁的表示法使其成为配置文件(非用户提供的文件)的不错选择.
  • JSON有限的功能,广泛的支持和更快的解析使其成为互操作性和用户提供的数据的绝佳选择.


H S*_*ogr 10

来自:Arnaud Lauret 的书“Web API 的设计”。:

JSON 数据格式

JSON是一种基于 JavaScript 编程语言如何描述数据的文本数据格式,尽管它的名字是完全独立于语言的(参见https://www.json.org/)。使用JSON,您可以描述包含无序名称/值对的对象以及包含有序值的数组或列表,如下图所示。

在此处输入图片说明

对象由花括号 ({}) 分隔。名称是带引号的字符串(“名称”),并用冒号 (:) 与其值分隔。值可以是类似“value”的字符串、类似 1.23 的数字、布尔值(真或假)、空值 null、对象或数组。数组由方括号 ([]) 分隔,其值由逗号 (,) 分隔。该JSON格式是使用任何编程语言轻松解析。它也相对容易阅读和编写。它被广泛用于许多用途,例如数据库、配置文件,当然还有 API。

YAML

YAML(YAML 不是标记语言)是一种人性化的数据序列化格式。与 JSON 一样,YAML ( http://yaml.org ) 是一种键/值数据格式。该图显示了两者的比较。

在此处输入图片说明

请注意以下几点:

  • YAML 中的属性名称和值周围没有双引号 (" ") 。

  • JSON 的结构花括号 ({}) 和逗号 (,) 在YAML 中被换行符和缩进替换。

  • YAML 中,数组括号 ([]) 和逗号 (,) 替换为破折号 (-) 和换行符 。

  • JSON不同,YAML允许以井号 (#) 开头的注释。将其中一种格式转换为另一种格式相对容易。但请注意,将YAML文档转换为JSON时,您将丢失注释。


Chr*_*nat 7

基准测试结果

以下是在 Python 和 Perl 上比较 YAML 与 JSON 加载时间的基准测试结果

JSON 速度更快,但会牺牲一些可读性和注释等功能

测试方法

结果

Python 3.8.3 timeit
    JSON:            0.108
    YAML CLoader:    3.684
    YAML:           29.763

Perl 5.26.2-043 Benchmark::cmpthese
    JSON XS:         0.107
    YAML XS:         0.574
    YAML Syck:       1.050

Perl 5.26.2-043 Dumbbench (Brian D Foy, excludes outliers)
    JSON XS:         0.102
    YAML XS:         0.514
    YAML Syck:       1.027
Run Code Online (Sandbox Code Playgroud)

  • JSON 更快,因为它不必处理引用、多种类型的容器、标签等。 (2认同)

小智 5

由于这个问题现在在搜索 YAML 和 JSON 时占据突出地位,因此值得注意的是两者之间一个很少被引用的区别:许可证。JSON 声称拥有JSON 用户必须遵守的许可证(包括法律上模棱两可的“应用于善,而不是恶”)。YAML 没有此类许可声明,这可能是一个重要的区别(对您的律师而言,如果不是对您而言)。


Mic*_*ner 5

有时,您不必决定其中之一。

例如,在 Go 中,您可以同时拥有两者:

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}
Run Code Online (Sandbox Code Playgroud)