- 性能(编码/解码时间) - 内存消耗 - 表达清晰度 - 库的可用性和易用性(我更喜欢C语言)
我打算在我们的嵌入式系统中使用其中之一来存储配置文件。
在技术上,YAML是JSON的超集。这意味着,理论上至少,YAML解析器可以理解JSON,但不一定反过来。
请参阅官方规范,在标题为"YAML: Relation to JSON" 的部分。
总的来说,有些我喜欢YAML而在JSON中不可用的东西。
实际上,对于您或我所做的事情,这最后两点都不太重要,但从长远来看,我认为YAML将是一个更强大和可行的数据序列化格式。
现在,AJAX和其他Web技术倾向于使用JSON。YAML目前更多地用于离线数据处理。例如,默认情况下包含在基于C的OpenCV计算机视觉软件包中,而JSON则不是。
您将找到JSON和YAML的C库。 YAML的库往往较新,但我过去没有遇到任何问题。请参见Yaml-cpp等示例。
差异:
{a: &b [*b]}
,这在某些转换器中会无限循环。即使有循环检测,仍然可能存在“yaml 炸弹”(请参见xml bomb)。观察结果:
这个标题回答了问题,但大多数人只是从谷歌搜索结果中读取标题,所以我认为有必要从网页开发者的角度进行解释。
JavaScript在Web领域中占据着绝对的主导地位,JavaScript开发人员普遍偏爱使用JSON作为数据格式,并且与流行的Web API一起使用,因此在一般意义上进行Web编程时,很难争辩使用YAML而不是JSON,因为在团队环境中你可能会被否决。事实上,大多数Web程序员甚至不知道YAML的存在,更不用考虑使用它。
如果你正在进行任何Web编程,JSON是默认选择,因为在使用JavaScript时不需要进行翻译步骤,所以在这种情况下,你必须提出更好的理由来使用YAML而不是JSON。
这个问题已经6年了,但奇怪的是,没有一个答案真正回答了所有四个方面(速度、内存、表现力、可移植性)。
显然这取决于实现方式,但由于JSON被广泛使用,并且很容易实现,因此它倾向于获得更多本机支持和更快的速度。考虑到YAML可以做JSON的所有事情,再加上一大堆其他功能,任何可以进行比较的两者实现中,JSON的实现很可能会更快。
然而,考虑到YAML文件可能比其JSON对应文件略小(由于较少的"
和,
字符),在特殊情况下,高度优化的YAML解析器可能更快。
基本上相同的论点适用。如果它们表示相同的数据结构,很难看出为什么YAML解析器会比JSON解析器更节省内存。
正如其他人指出的那样,Python程序员倾向于喜欢YAML,JavaScript程序员倾向于JSON。我会发表以下观察:
很难想象一个现代语言没有JSON库。也很难想象JSON解析器不实现完整规范。YAML得到了广泛的支持,但不如JSON普及,并且每个解析器都实现了不同的子集。因此,YAML文件比你想象的不太互操作。
JSON在性能(如果相关)和互操作性方面是最好的,适合机器读取。YAML更适合人类维护的文件。 HJSON 是一个不错的妥协选择,但可移植性大大降低。 JSON5 是一个更为合理的妥协,具有明确定义的语法。
其他答案已经很好了,先阅读那些答案。但我会额外补充一个使用YAML的原因:git。
越来越多的编程项目使用git仓库进行分发和存档。虽然git仓库的历史可以同样存储JSON和YAML文件,但用于跟踪和显示文件变化的“diff”方法是面向行的。由于YAML被强制为面向行,因此人类更容易看到YAML文件中的任何小变化。
当然,JSON文件也可以通过排序字符串/键并添加缩进来“美化”。但这不是默认设置,而且我懒得这样做。
就个人而言,我通常使用JSON进行系统间交互。我经常使用YAML进行配置文件、静态文件和跟踪文件。 (我一般避免添加YAML关系锚点。生命太短暂了,没必要追寻循环。)
此外,如果速度和空间确实是问题,我都不使用它们。你可以看看BSON。
我觉得YAML更容易阅读:比如括号、引号等字符较少。尽管在YAML中使用制表符可能会有些繁琐,但我们可以逐渐习惯。
就性能和资源而言,我不认为两者之间会有很大的差异。
此外,我们正在讨论配置文件,我不认为会频繁进行编码/解码操作,对吧?
从技术上讲,YAML 比 JSON 提供了更多的功能(YAML v1.2 是 JSON 的超集):
锚点和继承 - 三个相同项的示例:
item1: &anchor_name
name: Test
title: Test title
item2: *anchor_name
item3:
<<: *anchor_name
# You may add extra stuff.
大部分情况下,人们不会使用这些额外的特性,主要的区别在于YAML 使用缩进而 JSON 使用花括号。这使得 YAML 更加简洁和易读(对于熟练的读者)。
该选择哪一个呢?
以下是一个基准测试的结果,比较了在Python和Perl上加载YAML和JSON所花费的时间。
JSON速度更快,但可读性稍差,并且不支持像注释这样的功能。
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
来自:Arnaud Lauret《Web API设计》一书:
JSON数据格式
JSON是一种基于JavaScript编程语言描述数据的文本数据格式,尽管它的名称是JavaScript对象表示法(JavaScript Object Notation),但它完全独立于语言(参见https://www.json.org/)。使用JSON,您可以描述包含无序名称/值对的对象以及包含有序值的数组或列表,如下图所示。
一个对象由花括号({})界定。名称是一个带引号的字符串("name"),并且用冒号(:)与其值分隔。值可以是字符串,例如"value",数字,例如1.23,布尔值(true或false),空值null,对象或数组。数组由方括号([])界定,其值由逗号(,)分隔。
JSON格式可以使用任何编程语言轻松解析。它也相对容易阅读和编写。它被广泛用于许多用途,例如数据库、配置文件和API等。
YAML
YAML(YAML Ain’t Markup Language)是一种人性化的数据序列化格式。与JSON类似,YAML(http://yaml.org)是一种键/值数据格式。下图显示了两者的比较。
请注意以下几点:
YAML中的属性名称和值周围没有双引号(" ")。
JSON中的结构花括号({})和逗号(,)在YAML中被换行符和缩进所代替。
数组方括号([])和逗号(,)在YAML中被破折号(-)和换行符所代替。
与JSON不同,YAML允许以井号(#)开头的注释。将其中一个格式转换为另一个格式相对容易。但请注意,将YAML文档转换为JSON时会丢失注释。