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

我们什么时候应该使用YAML而不是JSON,反之亦然,考虑以下几点?

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

我打算在我们的embedded式系统中使用这两个中的一个来存储configuration文件。

有关:

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

技术上,YAML是JSON的超集。 这意味着,至less在理论上,YAMLparsing器可以理解JSON,但不一定是相反的。

请参阅“YAML:与JSON的关系”一节中的官方规范。

总的来说,我对YAML有些东西在JSON中是不可用的。

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

在实践中,最后两点都不会影响你或我做的事情,但从长远来看,我认为YAML将是一个更强大和可行的数据序列化格式。

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

你会发现JSON和YAML的C库。 YAML的图书馆往往比较新,但过去我没有遇到麻烦。 参见例如Yaml-cpp 。

区别:

  1. YAML,取决于你如何使用它,可以比JSON更具可读性
  2. JSON通常速度更快 ,可能仍然可以与更多系统互操作
  3. 可以非常快速地编写一个“足够好”的JSONparsing器
  4. 重复的密钥,可能是有效的JSON, 绝对是无效的YAML。
  5. YAML有很多function,包括评论和关系锚。 YAML语法因此相当复杂,而且可能很难理解。
  6. 可以在yaml: {a: &b [*b]}编写recursion结构,在某些转换器中将无限循环。 即使是循环检测,“yaml炸弹”仍然是可能的(见xml炸弹 )。
  7. 由于没有引用,因此不可能使用JSON序列化带有对象引用的复杂结构。 YAML序列化因此可以更有效率。

观察:

  1. Python程序员通常是YAML的忠实粉丝,因为使用了缩进而不是括号内的语法来表示级别。
  2. 许多程序员认为“含义”对缩进的依附是一个糟糕的select。
  3. 如果数据格式将离开应用程序的环境,在UI中parsing,或在消息传递层发送,JSON可能是更好的select。
  4. YAML可以直接用于复杂的任务,如语法定义,通常是比创build新语言更好的select。

绕过深奥的理论

这回答的标题,而不是细节,因为大多数只是从像我这样的谷歌search结果阅读标题,所以我觉得有必要从Web开发人员的angular度来解释。

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

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

JavaScript显然占据了networking的巨大空间,JavaScript开发人员更喜欢使用JSON作为数据格式,与stream行的Web API一起使用,所以在进行一般意义上的Web编程时,使用YAML和JSON进行争论变得困难,因为您可能会被超出在团队环境中。 事实上,大多数networking程序员甚至都不知道YAML存在,更不用说考虑使用YAML了。

如果你正在做任何web编程,JSON是默认的方法,因为在使用JavaScript时不需要翻译步骤,所以你必须提出一个更好的参数来在这种情况下使用YAML。

我发现YAML在眼睛上比较容易:less括号,“”等等。尽pipeYAML中有标签的烦恼,但是却有一个悬念。

在性能/资源方面,我不会指望两者有很大的差别。

此外,我们正在讨论configuration文件,所以我不希望高频率的编码/解码活动,不是吗?

如果你不需要YAML所具有的任何function,而JSON则不需要JSON,因为它非常简单并且得到了广泛的支持(在很多语言中有很多库)。 YAML更复杂,支持更less。 我不认为parsing速度或内存使用会有很大的不同,也可能不是你程序性能的很大一部分。

这个问题是6岁,但奇怪的是,没有一个答案真正解决了所有四点(速度,记忆,performance力,可移植性)。

速度

显然,这是依赖于实现的,但是由于JSON被广泛使用,并且易于实现,所以它倾向于得到更多的本地支持,因此速度更快。 考虑到YAML所做的一切JSON所做的事情,再加上更多的卡车,可能两者的任何类似的实现,JSON会更快。

但是,由于YAML文件可能比它的JSON文件略小(由于""字符less),所以在特殊情况下,高度优化的YAMLparsing器可能会更快。

记忆

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

performance

正如其他人所指出的那样,Python程序员倾向于倾向于使用YAML,JavaScript程序员使用JSON。 我会做出这些观察:

  • 记住JSON的整个语法很容易,因此对理解任何JSON文件的含义非常有信心。 YAML是任何人都不能真正理解的。 微妙和边缘情况的数量是极端的。
  • 因为很less有parsing器实现整个规范,所以在特定的上下文中更难确定给定expression式的含义。
  • 在JSON中缺乏评论实际上是一个真正的痛苦。

可移植性

没有JSON库的现代语言很难想象。 也很难想象一个JSONparsing器实现的东西比全规范还要小。 YAML有广泛的支持,但比JSON更普遍,每个parsing器都实现了不同的子集。 因此YAML文件比你想像的要less。

概要

JSON是性能(如果相关)和互操作性的优胜者。 YAML更适合用于人员维护的文件。 HJSON是一个体面的妥协,虽然可携带性大大降低。 JSON5是一个更合理的妥协,具有明确的语法。

技术上, YAML提供了比JSON更多的function (YAML v1.2是JSON的超集):

  • 注释
  • 锚和inheritance – 3个相同的项目的例子:

     item1: &anchor_name name: Test title: Test title item2: *anchor_name item3: <<: *anchor_name # You may add extra stuff. 

大多数时候人们不会使用这些额外的function,主要的区别是YAML使用缩进,JSON使用括号 。 这使得YAML更加简洁易读 (对于训练有素的人来说)。

哪一个select?

  • YAML额外的function和简洁的符号使它成为configuration文件 (非用户提供的文件)的不错select。
  • JSON有限的function,广泛的支持和更快的parsingfunction使其成为互操作性和用户提供数据的绝佳select。

由于这个问题现在在searchYAML和JSON时显着地突出,所以值得注意的是两者之间很less引用的区别:许可证。 JSON声称拥有JSON用户必须遵守的许可证 (包括合法歧义的“应当用于善良而不是邪恶”)。 YAML没有这样的许可声明,这可能是一个重要的区别(对你的律师,如果不是你)。

有时你不必为另外一个做另一个决定。

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

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

我发现YAML和JSON都非常有效。 当一个人被用于另一个时,我唯一的两个东西就是一个,这个语言最常用的是什么。 例如,如果我使用Java,Javascript,我将使用JSON。 对于Java,我将使用他们自己的对象,这些对象几乎是JSON,但是缺less一些function,如果我需要,或者将它转换为JSON,则将其转换为JSON。 我这样做是因为这在Java中是很常见的事情,使其他Java开发人员更容易修改我的代码。 第二件事是,我是否使用它来logging属性,或者程序是否以configuration文件的forms接收指令,在这种情况下,我将使用YAML,因为它非常容易被人阅读,看起来语法,并且很容易修改,即使你不知道YAML是如何工作的。 然后,该程序将读取它并将其转换为JSON,或任何该语言的首选。

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