YAML和JSON之间有什么不同,特别是考虑到以下事情?

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

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

相关:

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


当前回答

如果你不需要YAML有而JSON没有的任何特性,我更喜欢JSON,因为它非常简单,并且得到广泛支持(有很多语言的库)。YAML更复杂,支持更少。我不认为解析速度或内存使用会有太大的不同,而且可能不是程序性能的主要部分。

其他回答

我发现YAML更方便使用:括号更少,""等等。虽然YAML中有标签的烦恼…但总有人能掌握窍门。

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

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

这个问题已经提出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没有的任何特性,我更喜欢JSON,因为它非常简单,并且得到广泛支持(有很多语言的库)。YAML更复杂,支持更少。我不认为解析速度或内存使用会有太大的不同,而且可能不是程序性能的主要部分。

从技术上讲,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的例子。

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