YAML和JSON之间有什么不同,特别是考虑到以下事情?
性能(编码/解码时间) 内存消耗 表达清晰 库可用性,易用性(我更喜欢C)
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
相关:
应该使用YAML还是JSON来存储Perl数据?
YAML和JSON之间有什么不同,特别是考虑到以下事情?
性能(编码/解码时间) 内存消耗 表达清晰 库可用性,易用性(我更喜欢C)
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
相关:
应该使用YAML还是JSON来存储Perl数据?
当前回答
GIT 和 YAML
其他答案都很好。先读这些。但是我还要加上另一个有时使用YAML的原因:git。
越来越多的编程项目使用git存储库进行分发和归档。而且,虽然git回购的历史记录可以同样存储JSON和YAML文件,但用于跟踪和显示文件更改的“diff”方法是面向行的。由于YAML被迫面向行,因此YAML文件中的任何小更改都更容易被人看到。
当然,JSON文件确实可以通过对字符串/键进行排序和添加缩进来“变得漂亮”。但这不是默认的,我很懒。
就我个人而言,我通常使用JSON进行系统到系统的交互。我经常将YAML用于配置文件、静态文件和跟踪文件。(我通常也避免添加YAML关系锚。生命太短暂,没有时间去寻找循环。)
此外,如果速度和空间真的是一个问题,我都不用。你可能想看看BSON。
其他回答
这个问题已经提出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是一种更合理的折衷方案,具有定义良好的语法。
基准测试结果
下面是在Python和Perl上比较YAML和JSON加载时间的基准测试结果
JSON要快得多,但牺牲了一些可读性和注释等特性
测试方法
在一台快速机器上连续运行100次,平均秒数 数据集是一个3.44MB的JSON文件,包含从维基百科抓取的电影数据 https://raw.githubusercontent.com/prust/wikipedia-movie-data/master/movies.json 链接来源:https://github.com/jdorfman/awesome-json-datasets
结果
Python 3.8.3 timeit
JSON: 0.108
YAML CLoader: 3.684
YAML: 29.763
Perl 5.26.2 Benchmark::cmpthese
JSON XS: 0.107
YAML XS: 0.574
YAML Syck: 1.050
Perl 5.26.2 Dumbbench (Brian D Foy, excludes outliers)
JSON XS: 0.102
YAML XS: 0.514
YAML Syck: 1.027
如果您关心更好的解析速度,那么可以选择将数据存储在JSON中。我必须从其他用户修改文件的位置解析数据,因此我使用YAML,因为与JSON相比,它提供了更好的可读性。 你还可以在YAML文件中添加注释,这在JSON文件中是做不到的。
我发现YAML更方便使用:括号更少,""等等。虽然YAML中有标签的烦恼…但总有人能掌握窍门。
在性能/资源方面,我不认为两者之间有很大的差异。
此外,我们讨论的是配置文件,所以我不期望编码/解码活动的频率很高,不是吗?
GIT 和 YAML
其他答案都很好。先读这些。但是我还要加上另一个有时使用YAML的原因:git。
越来越多的编程项目使用git存储库进行分发和归档。而且,虽然git回购的历史记录可以同样存储JSON和YAML文件,但用于跟踪和显示文件更改的“diff”方法是面向行的。由于YAML被迫面向行,因此YAML文件中的任何小更改都更容易被人看到。
当然,JSON文件确实可以通过对字符串/键进行排序和添加缩进来“变得漂亮”。但这不是默认的,我很懒。
就我个人而言,我通常使用JSON进行系统到系统的交互。我经常将YAML用于配置文件、静态文件和跟踪文件。(我通常也避免添加YAML关系锚。生命太短暂,没有时间去寻找循环。)
此外,如果速度和空间真的是一个问题,我都不用。你可能想看看BSON。