考虑到以下事项,我们何时应该优先使用YAML而不是JSON,反之亦然?
我计划在嵌入式系统中使用这两个中的一个来存储配置文件。
答案 0 :(得分:568)
从技术上讲,YAML是JSON的超集。这意味着,至少在理论上,YAML解析器可以理解JSON,但不一定相反。
请参阅官方规范,标题为"YAML: Relation to JSON"。
一般来说,我喜欢YAML中某些JSON中没有的东西。
实际上,最后两点都不会对你或我所做的事情产生影响,但从长远来看,我认为YAML将是一种更健壮,更可行的数据序列化格式。
目前,AJAX和其他网络技术倾向于使用JSON。 YAML目前更多地用于离线数据处理。例如,它默认包含在基于C的OpenCV计算机视觉包中,而JSON则不包括在内。
您将找到JSON和YAML的C库。 YAML的图书馆往往更新,但我过去没有遇到任何问题。请参阅示例Yaml-cpp。
答案 1 :(得分:163)
的差异:
{a: &b [*b]}
,它将在某些转换器中无限循环。即使使用循环检测,仍然可以使用“yaml bomb”(参见xml bomb)。观察:
答案 2 :(得分:74)
这回答了标题,而不是详细信息,因为大多数只是像谷歌一样在google搜索结果中读取标题,因此我认为有必要从Web开发人员的角度解释 。
JavaScript显然在网络上占据了很大的优势,JavaScript开发人员更喜欢将JSON作为数据格式与流行的Web API一起使用,因此在进行一般意义上的Web编程时,使用YAML而不是JSON就很难争辩可能在团队环境中被投票。事实上,大多数网络程序员甚至不知道YAML存在,更不用说考虑使用它了。
如果您正在进行任何Web编程,JSON是默认的方法,因为在使用JavaScript时不需要转换步骤,因此在这种情况下您必须提出更好的参数来使用YAML而不是JSON。
答案 3 :(得分:31)
这个问题是6岁,但奇怪的是,没有一个答案能真正解决所有四个问题(速度,记忆力,表现力和便携性)。
显然这是依赖于实现的,但是因为JSON被如此广泛地使用并且易于实现,所以它倾向于获得更大的本机支持,因此速度更快。考虑到YAML完成JSON所做的一切,加上更多的卡车运载,很可能两者的任何类似实现,JSON都会更快。
但是,鉴于YAML文件可能略小于其JSON对应文件(由于"
和,
字符较少),因此可能是一个高度优化的YAML在特殊情况下,解析器可能会更快。
基本上相同的论点适用。如果YAML解析器代表相同的数据结构,那么为什么YAML解析器的内存效率会比JSON解析器更高。
正如其他人所指出的,Python程序员倾向于选择YAML,JavaScript程序员转向JSON。我会做出这些观察:
很难想象没有JSON库的现代语言。也很难想象一个JSON解析器实现的东西比完整规范少。 YAML得到了广泛的支持,但不如JSON普遍存在,并且每个解析器都实现了不同的子集。因此,YAML文件的可互操作性低于您的想象。
JSON是性能(如果相关)和互操作性的赢家。 YAML更适合人工维护的文件。虽然可移植性大大降低,HJSON是一个不错的折衷方案。 JSON5是一种更合理的妥协,具有明确定义的语法。
答案 4 :(得分:22)
我发现YAML在眼睛上更容易:更少的括号,“”等等。虽然YAML中有标签的烦恼......但是人们会对它有所了解。
就性能/资源而言,我不希望两者之间存在很大差异。
此外,我们正在谈论配置文件,所以我不希望编码/解码活动频率高,不是吗?
答案 5 :(得分:18)
如果您不需要YAML所具有的任何功能而JSON没有,我更喜欢JSON,因为它非常简单并得到广泛支持(在许多语言中有很多库)。 YAML更复杂,支持更少。我不认为解析速度或内存使用会有很大差异,也许并不是程序性能的重要部分。
答案 6 :(得分:17)
其他答案都很好。先读一下。但我有时会添加另一个使用YAML的理由: git 。
越来越多的编程项目使用git存储库进行分发和归档。而且,虽然git repo的历史记录可以同样存储JSON和YAML文件,但用于跟踪和显示文件更改的“diff”方法是面向行的。由于YAML被强制为面向行,因此人们更容易看到YAML文件中的任何小变化。
当然,通过对字符串/键进行排序并添加缩进,可以使JSON文件“变得漂亮”。但这不是默认的,而且我很懒。
就个人而言,我通常使用JSON进行系统间的交互。我经常使用YAML来配置文件,静态文件和跟踪文件。 (我通常也会避免添加YAML关系锚。生命太短,无法追捕循环。)
另外,如果速度和空间真的是一个问题,我也不使用。你可能想看看BSON。
答案 7 :(得分:10)
技术上YAML offers a lot more than JSON(YAML v1.2是JSON的超集):
锚点和继承 - 3个相同项目的示例:
item1: &anchor_name
name: Test
title: Test title
item2: *anchor_name
item3:
<<: *anchor_name
# You may add extra stuff.
大多数时候人们不会使用这些额外功能,主要区别在于 YAML使用缩进,而 JSON使用括号。这使得YAML更简洁,可读(对于训练有素的人)。
选择哪一个?
答案 8 :(得分:3)
由于此问题现在在搜索YAML和JSON时占据突出地位,因此值得注意的是两者之间很少引用的差异:许可证。 JSON声称有一个license JSON用户必须遵守(包括法律模糊的&#34;将用于Good,而不是Evil&#34;)。 YAML没有这样的许可声明,这可能是一个重要的区别(对你的律师,如果不是你)。
答案 9 :(得分:3)
有时你不必决定一个而不是另一个。
例如,在Go中,您可以同时拥有两个:
type Person struct {
Name string `json:"name" yaml:"name"`
Age int `json:"age" yaml:"age"`
}
答案 10 :(得分:3)
下面是比较Python和Perl上的YAML与JSON加载时间的基准测试结果
JSON的速度要快得多,但会牺牲一些可读性和注释等功能
Python 3.8.3 timeit
JSON: 0.108
YAML CLoader: 3.684
YAML: 29.763
Perl 5.26.2-043 Benchmark::cmpthese
JSON XS: 0.107
YAML XS: 0.574
YAML Syck: 1.050
Perl 5.26.2-043 Dumbbench (Brian D Foy, excludes outliers)
JSON XS: 0.102
YAML XS: 0.514
YAML Syck: 1.027
答案 11 :(得分:1)
JSON无法处理大数据。
不适用于处理不同的多媒体格式。
JSON不具有支持“注释”的功能。可以单独将其包含为附加属性。
YAML与JSON相比具有一些优势,例如自引用,对复杂数据类型的支持,嵌入式块文字,注释等。
答案 12 :(得分:1)
Javascript 开发者喜欢 JSON,python 开发者喜欢 YMAL
答案 13 :(得分:0)
如果您关心更好的解析速度,则可以选择将数据存储在 JSON 中。我必须从其他用户修改文件的位置解析数据,因此我使用了 YAML,因为与 JSON 相比,它提供了更好的可读性。 并且您还可以在 YAML 文件中添加 JSON 文件中无法完成的注释。
答案 14 :(得分:0)
编程世界,更重要的是,自2009年以来,网络发生了很大变化。我本人更喜欢JSON,而不是YAML,因为我是JavaScript开发人员,前端和后端都使用Node.js,但是许多反对JSON的论点都是无效的npm package hjson。
YAML比JSON更加紧凑和简洁,但是开源库hjson在许多语言中提供了两全其美的方式,具有YAML的清晰可读性,但具有JSON的清晰性和结构性。 / p>
以下是JSON,YAML和hjson的示例,它们均表示相同的数据以证明这一点:
{
"first_name": "John",
"last_name": "Smith",
"age": 25,
"address": {
"street_address": "21 2nd Street",
"city": "New York",
"state": "NY",
"postal_code": "10021"
},
"phone_numbers": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
],
"sex": {
"type": "male"
}
}
first_name: John
last_name: Smith
age: 25
address:
street_address: 21 2nd Street
city: New York
state: NY
postal code: '10021'
phone_numbers:
- type: home
number: 212 555-1234
- type: fax
number: 646 555-4567
sex:
type: male
{
first_name: John
last_name: Smith
age: 25
address: {
street_address: 21 2nd Street
city: New York
state: NY
postal_code: 10021
}
phone_numbers: [
{
type: home
number: 212 555-1234
}
{
type: fax
number: 646 555-4567
}
]
sex: {
type: male
}
}
的数据示例
YAML和hjson都允许使用注释,并且可以通过使用保留键字段(即:
)在JSON中潜在地使用JSON:
{
"_comment": "comment",
"key": "field"
}
YAML:
# comment
key: field
hjson:
{
# comment
// comment
/*
comment
*/
key: field
}
hjson为注释样式提供了更多选项,包括对多行注释的支持。
hjson还支持多行字符串,并保留制表符:
{
multilineString:
'''
Multiline string
tabs preserved
Cool!
'''
}
JSON是最易于访问的,因为它内置在JavaScript中并且易于在Web上使用,但是hjson可以轻松地安装到Node.js项目中,只需使用:npm install hjson
,代替{{1 }}文件扩展名为.json
,并将hjson extension安装到VS Code。
您也可以尝试hjson online playground,在hjson和JSON之间转换。
答案 15 :(得分:0)
来自:Arnaud Lauret书“ Web API的设计。”:
JSON数据格式
JSON 是一种文本数据格式,基于JavaScript编程语言描述数据的方式,但是尽管名称如此,却完全独立于语言(请参见https://www.json.org/)。使用 JSON ,您可以描述包含无序名称/值对的对象以及包含有序值的数组或列表,如该图所示。
对象由花括号({})分隔。名称是用引号引起来的字符串(“名称”),并用冒号(:)将其与值分开。值可以是“值”之类的字符串,也可以是1.23之类的数字,布尔值(true或false),空值null,对象或数组。数组以方括号([])分隔,其值以逗号(,)分隔。 JSON 格式可以使用任何编程语言轻松解析。它也相对容易读写。它被广泛用于许多用途,例如数据库,配置文件,当然还有API。
YAML
YAML (YAML不是标记语言)是一种易于使用的数据序列化格式。与JSON一样,YAML(http://yaml.org)是键/值数据格式。该图显示了两者的比较。
请注意以下几点:
在 YAML 中,属性名称和值之间没有双引号(“”)。
JSON的结构花括号({})和逗号(,)被换行符和 YAML 中的缩进。
数组括号([])和逗号(,)替换为破折号(-)和换行符 YAML 。
与 JSON 不同, YAML 允许以井号(#)开头的注释。 将其中一种格式转换为另一种格式相对容易。不过请注意,将 YAML 文档转换为 JSON 时,您将失去注释。
答案 16 :(得分:0)
我发现YAML和JSON都非常有效。当一个用于另一个对我来说真正决定的唯一两件事就是一个,这个语言最常用的是什么。例如,如果我使用Java,Javascript,我将使用JSON。对于Java,我将使用他们自己的对象,这些对象几乎是JSON但缺少某些功能,如果我需要或者首先使用JSON将其转换为JSON。我这样做是因为这在Java中很常见,并且使其他Java开发人员更容易修改我的代码。第二件事是我是否使用它来让程序记住属性,或者如果程序以配置文件的形式接收指令,在这种情况下我会使用YAML,因为它使用YAML。非常容易阅读,具有漂亮的语法,并且很容易修改,即使你不知道YAML是如何工作的。然后,程序将读取它并将其转换为JSON,或者该语言首选的任何内容。
最后,老实说并不重要。任何有经验的程序员都可以轻松阅读JSON和YAML。