YAML和JSON之间有什么不同,特别是考虑到以下事情?
性能(编码/解码时间) 内存消耗 表达清晰 库可用性,易用性(我更喜欢C)
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
相关:
应该使用YAML还是JSON来存储Perl数据?
YAML和JSON之间有什么不同,特别是考虑到以下事情?
性能(编码/解码时间) 内存消耗 表达清晰 库可用性,易用性(我更喜欢C)
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
相关:
应该使用YAML还是JSON来存储Perl数据?
当前回答
从技术上讲,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没有这样的许可声明,这可能是一个重要的区别(对您的律师来说,如果不是对您来说)。
我发现YAML更方便使用:括号更少,""等等。虽然YAML中有标签的烦恼…但总有人能掌握窍门。
在性能/资源方面,我不认为两者之间有很大的差异。
此外,我们讨论的是配置文件,所以我不期望编码/解码活动的频率很高,不是吗?
如果你不需要YAML有而JSON没有的任何特性,我更喜欢JSON,因为它非常简单,并且得到广泛支持(有很多语言的库)。YAML更复杂,支持更少。我不认为解析速度或内存使用会有太大的不同,而且可能不是程序性能的主要部分。
基准测试结果
下面是在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编码六种数据类型:对象(映射)、数组、字符串数字、布尔值和Null。对于机器来说,它非常容易解析,并且提供很少的灵活性。说明书大约有一页半。
YAML allows the encoding of arbitrary Python data and other crazy crap (which leads to vulnerabilities when decoding it). It is hard to parse because it offers so much flexibility. The specification for YAML was 86 pages, the last time I checked. YAML syntax is obviously influenced by Python, but maybe they should have been a little more influenced by the Python philosophy on a few points: e.g. “there should be one—and preferably only one—obvious way to do it” and “simple is better than complex.”
与JSON相比,YAML的主要优点是更容易阅读和编辑,这使它成为配置文件的自然选择。
最近,我倾向于使用TOML作为配置文件。它不像YAML那样漂亮或灵活,但对机器和人类来说都更容易解析。该语法(几乎)是INI语法的超集,但它解析为类似json的数据结构,只添加了一种额外类型:日期类型。