考虑到以下因素,我们何时应该优先使用YAML而不是JSON,反之亦然?
我计划在嵌入式系统中使用这两个中的一个来存储配置文件.
And*_*dyL 618
从技术上讲,YAML是JSON的超集.这意味着,至少在理论上,YAML解析器可以理解JSON,但不一定相反.
请参阅标题为"YAML:与JSON的关系"的部分中的官方规范.
一般来说,我喜欢YAML中某些JSON中没有的东西.
实际上,最后两点都不会对你或我所做的事情产生影响,但从长远来看,我认为YAML将是一种更强大和可行的数据序列化格式.
目前,AJAX和其他Web技术倾向于使用JSON.YAML目前更多地用于离线数据处理.例如,它默认包含在基于C的OpenCV计算机视觉包中,而JSON则不包括在内.
您将找到JSON和YAML的C库.YAML的图书馆往往更新,但我过去没有遇到任何问题.参见例如Yaml-cpp.
Eri*_*sty 183
区别:
{a: &b [*b]},它将在某些转换器中无限循环.即使使用循环检测,仍然可以使用"yaml炸弹"(参见xml炸弹).观察:
Jas*_*ing 79
这回答了标题,而不是详细信息,因为大多数人只是像谷歌一样从google搜索结果中读取标题,所以我觉得有必要从Web开发人员的角度进行解释.
JavaScript如此明显地占据了网络的巨大优势,JavaScript开发人员更喜欢将JSON作为数据格式与流行的Web API一起使用,因此在进行一般意义上的Web编程时,很难使用YAML而不是JSON,因为您很可能会被淘汰在团队环境中.实际上,大多数Web程序员甚至都不知道YAML存在,更不用说考虑使用它了.
如果您正在进行任何Web编程,JSON是默认的方法,因为在使用JavaScript时不需要转换步骤,因此在这种情况下您必须提出更好的参数来使用YAML而不是JSON.
Ste*_*ett 34
这个问题是6岁,但奇怪的是,没有一个答案确实解决了所有四个方面(速度,记忆力,表现力,便携性).
显然这是依赖于实现的,但是因为JSON被如此广泛地使用并且易于实现,所以它倾向于获得更大的本机支持,因此速度更快.考虑到YAML完成了JSON所做的一切,加上更多的卡车运载,很可能两者的任何类似实现,JSON都会更快.
然而,考虑到YAML文件可以稍微小于其对应的JSON(由于较少"和,字符),它可能是一个高度优化的YAML解析器可能会更快在特殊情况下.
基本上相同的论点适用.如果YAML解析器代表相同的数据结构,那么很难理解为什么YAML解析器比JSON解析器更有效.
正如其他人所指出的,Python程序员倾向于选择YAML,JavaScript程序员转向JSON.我会做出这些观察:
很难想象没有JSON库的现代语言.也很难想象一个JSON解析器实现的东西比完整规范少.YAML得到了广泛的支持,但不如JSON普遍存在,并且每个解析器都实现了不同的子集.因此,YAML文件的可互操作性低于您的想象.
JSON是性能(如果相关)和互操作性的赢家.YAML更适合人工维护的文件.虽然可移植性大大降低,但HJSON是一个不错的折衷方案.JSON5是一种更合理的折衷方案,语法定义明确.
Joh*_*nAD 25
其他答案都很好.先读一下.但我有时会添加另一个使用YAML的理由:git.
越来越多的编程项目使用git存储库进行分发和归档.而且,虽然git repo的历史记录可以同样存储JSON和YAML文件,但用于跟踪和显示文件更改的"diff"方法是面向行的.由于YAML被强制为面向行,因此人类更容易看到YAML文件中的任何小变化.
当然,通过对字符串/键进行排序并添加缩进,可以使JSON文件"变得漂亮".但这不是默认值而且我很懒.
就个人而言,我通常使用JSON进行系统到系统的交互.我经常使用YAML来配置文件,静态文件和跟踪文件.(我通常也会避免添加YAML关系锚.生命太短,无法追捕循环.)
此外,如果速度和空间真的是一个问题,我也不使用.你可能想看看BSON.
jld*_*ont 22
我发现YAML在眼睛上更容易:更少的括号,""等等.尽管YAML中有标签的烦恼......但是人们可以了解它.
在性能/资源方面,我不希望两者之间存在很大差异.
此外,我们正在谈论配置文件,所以我不期望高频率的编码/解码活动,不是吗?
小智 19
如果您不需要YAML具有的任何功能而JSON没有,我更喜欢JSON,因为它非常简单并得到广泛支持(在许多语言中有很多库).YAML更复杂,支持更少.我不认为解析速度或内存使用会有很大差异,也许并不是程序性能的重要部分.
Wer*_*ght 12
从技术上讲,YAML提供的不仅仅是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.
Run Code Online (Sandbox Code Playgroud)大多数时候人们不会使用这些额外功能,主要区别在于YAML使用缩进而JSON使用括号.这使得YAML更加简洁和可读(对于训练有素的眼睛).
哪一个选择?
H S*_*ogr 10
来自:Arnaud Lauret 的书“Web API 的设计”。:
JSON 数据格式
JSON是一种基于 JavaScript 编程语言如何描述数据的文本数据格式,尽管它的名字是完全独立于语言的(参见https://www.json.org/)。使用JSON,您可以描述包含无序名称/值对的对象以及包含有序值的数组或列表,如下图所示。
对象由花括号 ({}) 分隔。名称是带引号的字符串(“名称”),并用冒号 (:) 与其值分隔。值可以是类似“value”的字符串、类似 1.23 的数字、布尔值(真或假)、空值 null、对象或数组。数组由方括号 ([]) 分隔,其值由逗号 (,) 分隔。该JSON格式是使用任何编程语言轻松解析。它也相对容易阅读和编写。它被广泛用于许多用途,例如数据库、配置文件,当然还有 API。
YAML
YAML(YAML 不是标记语言)是一种人性化的数据序列化格式。与 JSON 一样,YAML ( http://yaml.org ) 是一种键/值数据格式。该图显示了两者的比较。
请注意以下几点:
YAML 中的属性名称和值周围没有双引号 (" ") 。
JSON 的结构花括号 ({}) 和逗号 (,) 在YAML 中被换行符和缩进替换。
在YAML 中,数组括号 ([]) 和逗号 (,) 替换为破折号 (-) 和换行符 。
与JSON不同,YAML允许以井号 (#) 开头的注释。将其中一种格式转换为另一种格式相对容易。但请注意,将YAML文档转换为JSON时,您将丢失注释。
以下是在 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
Run Code Online (Sandbox Code Playgroud)
有时,您不必决定其中之一。
例如,在 Go 中,您可以同时拥有两者:
type Person struct {
Name string `json:"name" yaml:"name"`
Age int `json:"age" yaml:"age"`
}
Run Code Online (Sandbox Code Playgroud)