YAML和JSON有什么区别?


733

YAML和JSON有什么区别,特别考虑以下几点?

  • 性能(编码/解码时间)
  • 内存消耗
  • 表情清晰
  • 图书馆的可用性,易用性(我更喜欢C)

我打算在嵌入式系统中使用这两个之一来存储配置文件。

有关:

我应该使用YAML还是JSON存储我的Perl数据?


26
要知道,JSON可以被认为是YAML的一个子集:en.wikipedia.org/wiki/JSON#YAML
查尔斯

2
@Charles,是的,但是它们有一些细微的区别:ajaxian.com/archives/json-yaml-its-getting-closer-to-truth
pierrotlefou

1
由于YAML(大约)是JSON的超集,因此如果不假设您是否将使用这种表现力就无法回答性能问题。如果您不需要它:YAML解析器读取JSON的速度有多快?如果您确实需要它:当您允许同一想法的可能更长的JSON表示形式时,JSON解析器的速度要慢多少?
poolie 2012年

@jokoon我猜“我宁愿一个C库”(例如libyaml)
DBR

4
YAML文档可能很复杂且难以阅读。使用YAML可能会发生“数十亿笑声”攻击。另一方面,可以在YAML中有效地序列化复杂的对象,图形和其他结构。对于交换格式和简单结构,JSON是首选。对于复杂的对象序列化或语法定义,YAML可能是首选。
埃里克·阿隆斯蒂2013年

Answers:


655

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

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

通常,我喜欢某些关于YAML的东西,这些东西在JSON中不可用。

  • 正如@jdupont所指出的,YAML在视觉上更易于查看。实际上,YAML主页本身就是有效的YAML,但是对于人类而言,它很容易阅读。
  • YAML能够使用“锚”引用YAML文件中的其他项目。因此,它可以处理在MySQL数据库中可能发现的关系信息。
  • YAML是有关嵌入其他序列化格式诸如JSON或XML更健壮的 YAML文件。

在实践中,最后两点都不会对您或我所做的事情有影响,但从长远来看,我认为YAML将是更健壮和可行的数据序列化格式。

目前,AJAX和其他Web技术倾向于使用JSON。目前,YAML被更多地用于脱机数据处理。例如,默认情况下,它包含在基于C的OpenCV计算机视觉程序包中,而JSON没有。

您会发现JSON和YAML的C库。YAML的库往往是较新的,但过去我对它们没有遇到任何麻烦。参见例如Yaml-cpp


199
json 不是一个子集(尽管它是很接近的),当您使用它们时,不兼容的情况会更加严重。json库通常更快...(stackoverflow.com/questions/2451732/…)。yaml支持者将坚持认为这是一个子集。如果要考虑可读性,请使用yaml。如果需要考虑互操作性和速度,请使用JSON。
Erik Aronesty

6
YAML是JSON语法的特定形式的超集。也就是说,如果您以与YAML兼容的方式使用JSON,则它是适当的子集。正如Pierr所说,这些规范是[旨在实现兼容性](ajaxian.com/archives/json-yaml-its-getting-closer-to-truth)。
naught101

120
YAML还支持方便的注释。

59
@ErikAronesty JSON接近于YAML 1.1的一个子集,但是自YAML 1.2起,它现在是一个真正的子集。YAML 1.2最初发布是为了消除两个规范之间的最后几个不兼容之处。
00prometheus

64
根据YAML 1.2规范:“此修订的主要目标是使YAML符合JSON作为官方子集的要求。”
Rich C

203

差异:

  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可以直接用于诸如语法定义之类的复杂任务,并且比发明新语言通常是更好的选择。

9
它是。Yaml 1.2的全部目的是解决一些兼容性差异,以使JSON成为严格的子集。如果您认为规范没有达到目的,Erik,请举一个有效JSON违反YAML规范和/或破坏经过验证的1.2兼容YAML解析器的示例。
SFEley13年

32
@SFEley YAML规范说存在潜在有效的JSON文件,这些文件将是无效的YAML。但这不太可能真正使用。“ JSON的RFC4627要求映射键仅是“ SHOULD”是唯一的,而YAML坚持认为它们是“必须”。技术上,YAML遵循JSON规范,选择将重复项视为错误。实际上,由于JSON在对于此类重复项的语义,唯一可移植的JSON文件是具有唯一密钥的文件,因此它们是有效的YAML文件。” - yaml.org/spec/1.2/spec.html#id2759572
戴维·毕晓普

9
评论缩进的使用;好吧,我相信这可能需要习惯,而不是每个人都喜欢。例如,我是.NET专家。我正在查看travis.yml文件,想知道为什么会出现问题。我发现我有一个不在其中的选项卡。由于空格/制表符/换行的首选项,并不是每个人都习惯这种爆炸。
Phil

10
完全不允许制表符作为缩进字符。恕我直言,这是所有语言的良好编码风格-带有或不带有语法缩进。
00prometheus

6
@Wyrmwood我个人很喜欢python和YAML,并且每天都会使用它们。我倾向于将YAML用于人们必须经常编辑的内容,而将JSON用于人们“可能”需要查看的内容。我受到了C ++开发人员的有效批评,他们发现缩进令人困惑..尤其是在存在多个级别或更长的功能块的情况下。当然...良好的可测试代码没有这些东西,因此通常不是问题。这是我的个人观察,但是任何随意的Google搜索都会产生许多结果...。因此,进行验证很简单。
Erik Aronesty '17

88

绕开深奥的理论

这回答了标题,而不是细节,因为大多数人只是从像我这样的Google搜索结果中读取标题,所以我觉得有必要从网络开发人员的角度进行解释。

  1. YAML使用空间缩进,这是Python开发人员熟悉的领域。
  2. JavaScript开发人员喜欢JSON,因为它是JavaScript的子集,可以直接在JavaScript中解释和编写,还可以使用简写方式声明JSON,在使用不带空格的典型变量名时,键中不需要双引号。
  3. 对于YAML和JSON,有太多的解析器在所有语言中都能很好地工作。
  4. 在许多情况下,YAML的空间格式可能更易于查看,因为格式要求使用更易于理解的方法。
  5. 如果您在编辑器中看不到空格格式,则YAML的表单虽然更紧凑且更易于查看,但看起来很难手动编辑。制表符不是空格,因此如果您没有编辑器来将击键解释为空格,则会进一步造成混淆。
  6. 与要检查的YAML相比,JSON的功能要少得多,因此JSON的序列化和反序列化速度要快得多,这使得更小更轻的代码可以处理JSON。
  7. 一个常见的误解是,YAML比JSON需要更少的标点并且更紧凑,但这完全是错误的。空格是不可见的,因此似乎字符较少,但是如果您计算实际的空格,以便正确解释YAML和正确的缩进,必须存在该空格,您会发现YAML实际上比JSON需要更多的字符。JSON不使用空格来表示层次结构或分组,并且可以很容易地进行平整,并删除不必要的空格以进行更紧凑的传输。

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

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

如果您正在执行任何Web编程,则JSON是默认的处理方式,因为使用JavaScript时不需要任何翻译步骤,因此在这种情况下,您必须提出一个更好的参数以在JSON上使用YAML。


10
我不同意python开发人员更喜欢YAML。Pythons dict基本上是JSON,字典列表也基本上是JSON。Python已内置json lib。附带说明一下,我是python开发人员,并且我更喜欢JSON(我知道的大多数python开发人员都更喜欢JSON)。
karantan '16

6
关于空白,真正困扰我的一件事是,它容易被混淆并出错,因为缩进或不缩进可能意味着其嵌套或处于同一水平,而且如果不这样做,也很容易出错。有一个指导原则。就像隐藏的哎呀,这真的不是那么容易的类型,在编辑Yaml时没有人说过。从来没有json的问题。
杰森·塞布林

6
@JasonSebring。您几乎想知道为什么YAML带有空格。YAML的第一个“浸入海洋”导致应用程序坏了……全部是因为空间。您曾经认为,使用缩进而不使用非打印字符会更有意义!(这就是为什么他们为什么不选择'。'而不是''?)要了解YAML,您必须先阅读规范。理解JSON并不需要。(我去过前者,从来没有去过后者)。对我来说,这表明该格式不是真正的“人类可读”格式
cmroanirgo,2016年

7
@cmroanirgo是的,这是我的经验。我的老板强迫我们在JSON上使用YAML,这使事情不必要地难以编辑和摄取。我之所以写这封信,是因为希望投票能为我辩护。
杰森·塞布林

3
YAML中的选项卡出现问题意味着(a)无法阅读错误消息,并且(b)具有未突出显示选项卡的编辑器。这两个问题都很容易纠正,所以我不理解这些投诉。
toolforger

38

这个问题已有6年历史了,但是奇怪的是,没有一个答案能真正解决所有四个问题(速度,记忆力,表达力,可移植性)。

速度

显然,这是依赖于实现的,但是由于JSON的使用如此广泛且易于实现,因此它倾向于获得更多的本机支持,从而提高了速度。考虑到YAML可以完成JSON的所有工作,再加上更多的工作量,因此可能在两者的任何可比较实现中,JSON都将更快。

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

记忆

基本上,相同的论点适用。很难理解,如果YAML解析器表示相同的数据结构,为什么它比JSON解析器具有更高的内存效率。

表现力

正如其他人指出的那样,Python程序员倾向于使用YAML,JavaScript程序员倾向于JSON。我将进行以下观察:

  • 记住JSON的整个语法很容易,因此对理解任何JSON文件的含义非常有信心。YAML并不是任何人都能真正理解的。微妙和极端情况的数量是极端的。
  • 由于很少有解析器实现整个规范,因此更加难以确定给定上下文中给定表达式的含义。
  • 实际上,JSON中缺少注释是一种真正的痛苦。

可移植性

很难想象没有JSON库的现代语言。很难想象一个JSON解析器实现了比完整规范还少的功能。YAML具有广泛的支持,但没有JSON普及,并且每个解析器实现一个不同的子集。因此,YAML文件的互操作性不如您想象的那样。

摘要

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


3
我实际上以为YAML较小,因为看不见的字符欺骗了我。不可见=>不存在,实际上不存在。如果您计算必须要包含的不可见字符,尤其是当YAML获得更大的嵌套时,它很快就会超过JSON。我只是觉得这很有趣,因为人类可理解的部分使我们大多数人都陷入了这种观念,直到我真正想到它为止,因为您可以扁平化JSON和YAML,而没有那么多。我还发现,YAML很难手动编辑,而不是阅读,仅在需要打开编辑器指南时进行编辑,否则有时容易误入嵌套项。
杰森·塞布林

1
我觉得这里没有答案明确指出:“对于设置/配置文件,YAML更好(由于每个人上面提到的原因)。对于机器/机器互操作,请使用JSON”。换句话说:如果您的目标受众是人类,那么YAML会更好。如果目标是另一个程序(但是您仍然希望数据可读),请使用JSON。
Florin T.

没错,但是这个问题提出了一些非常具体的参数,要求他们比较两者。就个人而言,我绝不会将YAML用于任何事情。如果人工维护很重要,我会使用JSON进行互操作,或者使用JSON6。
史蒂夫·贝内特

29

GIT和YAML

其他答案很好。请先阅读这些内容。但是我有时还会加上另一个使用YAML的理由:git

越来越多的编程项目使用git存储库进行分发和归档。而且,尽管git repo的历史记录可以平均存储JSON和YAML文件,但是用于跟踪和显示文件更改的“ diff”方法是面向行的。由于强制将YAML面向行,因此人很容易看到YAML文件中的任何细微变化。

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

就个人而言,我通常使用JSON进行系统间的交互。我经常将YAML用于配置文件,静态文件和跟踪文件。(我通常也避免添加YAML关系锚。生命太短而无法寻找循环。)

另外,如果速度和空间确实是一个问题,我也不会使用。您可能要看一下BSON。


22

我发现YAML看起来更容易:圆括号,“”等更少。尽管YAML中的制表符很烦人,但其中的一环却无处可去。

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

此外,我们正在谈论配置文件,因此我不希望出现频繁的编码/解码活动,不是吗?


22
我想知道您对制表符的烦恼是什么意思。我认为yaml中不允许使用制表符,我个人认为这在任何源文件中都是一个好主意
poolie 2012年

6
@poolie:jldupont可能指的是YAML中语法上重要的前导空白
naught101

10
可以,但它们不是标签。
poolie 2014年

20

如果您不需要YAML拥有的任何功能,而JSON则没有,那么我将更喜欢JSON,因为它非常简单并且得到了广泛支持(具有许多语言的库)。YAML更复杂且支持较少。我认为解析速度或内存使用不会有太大差异,并且可能不会对程序性能产生很大影响。


3
YAML以哪种方式更复杂?
Accatyyc

18
例如,YAML支持锚,如另一个答案中所述。还有其他功能,例如可扩展的数据类型。这使得解析起来更加复杂,并解释了为什么YAML具有更大的规格。根据解析器的实现,它可能会损害性能(请看以下问题:stackoverflow.com/questions/2451732/…)。
安东·斯特罗贡诺夫

5
如果复杂性使您有能力获得更大的总体简化性,那么复杂性比简单性要好。当然,这取决于数据模型的复杂性。
乔纳森·诺伊菲尔德

3
我可能在这里有点晚了,但是YAML可以添加注释,而JSON不能。对我来说,对规格文档
很有帮助

@Accatyyc。我认为人们在这里问有关差异的事实是肯定的迹象,YAML并非易事。我从未问过有关JSON的问题(“为什么不能在其中添加注释?”)
cmroanirgo

15

从技术上讲,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.
  • ...

大多数时候,人们不会使用那些额外的功能,主要区别是YAML使用缩进,JSON使用括号。这使YAML更加简洁易读(对于受过训练的眼睛)。

选择哪一个?

  • YAML的附加功能和简洁的符号使其成为配置文件(非用户提供的文件)的不错选择。
  • JSON的有限功能,广泛的支持和更快的解析使其成为互操作性和用户提供的数据的理想选择。

4

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


我不使用JSON,我使用的是JSON的完全等效形式,而没有将其称为JSON。我称它为PS-OFF。您要起诉我使用{ "": #, [] }???
安德鲁(Andrew)

4

有时,您不必决定一个。

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

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}

3

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

JSON数据格式

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

在此处输入图片说明

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

YAML

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

在此处输入图片说明

请注意以下几点:

  • YAML中属性名称和值之间没有双引号(“”)。

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

  • 数组方括号([])和逗号(,)在YAML中由短划线(-)和换行符代替 。

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


0

我发现YAML和JSON都很有效。对我而言,真正决定何时使用一种语言的唯一两件事是一种,即该语言最常使用的语言。例如,如果我使用Java,Javascript,则将使用JSON。对于Java,我将使用他们自己的对象,这些对象几乎是JSON但缺少某些功能,如果需要或首先将其转换为JSON,则将其转换为JSON。我这样做是因为这在Java中很常见,并且使其他Java开发人员更容易修改我的代码。第二件事是我是在程序中使用它来记住属性,还是程序正在接收配置文件形式的指令,在这种情况下,我将使用YAML,因为它很容易被人阅读,具有很好的可读性。看起来很语法,而且很容易修改,即使您不知道YAML的工作原理。然后,程序将读取它并将其转换为JSON或该语言的首选格式。

最后,老实说没关系。任何有经验的程序员都可以轻松阅读JSON和YAML。


-1
  • JSON无法处理比较yml的大数据

  • 不适合处理不同的多媒体格式。

  • JSON没有支持“注释”的功能。这可以单独作为附加属性包括在内。

  • 与JSON相比,YAML具有一些优势,例如自引用,对复杂数据类型的支持,嵌入式块文字,注释等。

  • JSON仅可读,而YAML既可读又可编辑。
  • JSON是YAML的子集,因此YAML解析器可以解析JSON。
  • YAML不使用任何额外的定界符,因此它比XML和JSON轻巧。

您对“大数据”和“仅可读”点的意思是什么?JSON是一种数据格式,抽象概念可以有这两个限制吗?
若奥·法里亚斯

4
@JoãoFarias假设您有1GB JSON文件和1GB CSV文件,并且有256MB内存。您可以逐行处理CSV文件,而使用JSON则不太容易。逐行解析YAML文件可能比解析JSON更容易。
NeverEndingQueue '19
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.