YAML和JSON有什么区别,特别考虑以下几点?
- 性能(编码/解码时间)
- 内存消耗
- 表情清晰
- 图书馆的可用性,易用性(我更喜欢C)
我打算在嵌入式系统中使用这两个之一来存储配置文件。
YAML和JSON有什么区别,特别考虑以下几点?
我打算在嵌入式系统中使用这两个之一来存储配置文件。
Answers:
从技术上讲,YAML是JSON的超集。这意味着,至少从理论上讲,YAML解析器可以理解JSON,但不一定可以理解。
请参阅标题为“ YAML:与JSON的关系”的部分中的官方规范。
通常,我喜欢某些关于YAML的东西,这些东西在JSON中不可用。
在实践中,最后两点都不会对您或我所做的事情有影响,但从长远来看,我认为YAML将是更健壮和可行的数据序列化格式。
目前,AJAX和其他Web技术倾向于使用JSON。目前,YAML被更多地用于脱机数据处理。例如,默认情况下,它包含在基于C的OpenCV计算机视觉程序包中,而JSON没有。
您会发现JSON和YAML的C库。YAML的库往往是较新的,但过去我对它们没有遇到任何麻烦。参见例如Yaml-cpp。
差异:
{a: &b [*b]}
,它将在某些转换器中无限循环。即使进行循环检测,“ yaml炸弹”仍然是可能的(请参阅xml炸弹)。观察结果:
这回答了标题,而不是细节,因为大多数人只是从像我这样的Google搜索结果中读取标题,所以我觉得有必要从网络开发人员的角度进行解释。
JavaScript如此明显地在网络上占据了主导地位,JavaScript开发人员更倾向于将JSON作为数据格式与流行的Web API一起使用,因此在一般意义上进行Web编程时,很难争辩使用YAML而不是JSON,因为您可能会被淘汰在团队环境中。实际上,大多数Web程序员甚至都不知道YAML的存在,更不用说考虑使用它了。
如果您正在执行任何Web编程,则JSON是默认的处理方式,因为使用JavaScript时不需要任何翻译步骤,因此在这种情况下,您必须提出一个更好的参数以在JSON上使用YAML。
这个问题已有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 repo的历史记录可以平均存储JSON和YAML文件,但是用于跟踪和显示文件更改的“ diff”方法是面向行的。由于强制将YAML面向行,因此人很容易看到YAML文件中的任何细微变化。
当然,通过对字符串/键进行排序并添加缩进,可以使JSON文件“漂亮”。但这不是默认值,我很懒。
就个人而言,我通常使用JSON进行系统间的交互。我经常将YAML用于配置文件,静态文件和跟踪文件。(我通常也避免添加YAML关系锚。生命太短而无法寻找循环。)
另外,如果速度和空间确实是一个问题,我也不会使用。您可能要看一下BSON。
我发现YAML看起来更容易:圆括号,“”等更少。尽管YAML中的制表符很烦人,但其中的一环却无处可去。
在性能/资源方面,我不希望两者之间有很大的差异。
此外,我们正在谈论配置文件,因此我不希望出现频繁的编码/解码活动,不是吗?
如果您不需要YAML拥有的任何功能,而JSON则没有,那么我将更喜欢JSON,因为它非常简单并且得到了广泛支持(具有许多语言的库)。YAML更复杂且支持较少。我认为解析速度或内存使用不会有太大差异,并且可能不会对程序性能产生很大影响。
从技术上讲,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.
大多数时候,人们不会使用那些额外的功能,主要区别是YAML使用缩进,而JSON使用括号。这使YAML更加简洁易读(对于受过训练的眼睛)。
选择哪一个?
由于此问题现在在搜索YAML和JSON时尤为突出,因此值得注意的是两者之间一个很少被引用的区别:许可证。JSON声称拥有JSON用户必须遵守的许可证(包括法律上模棱两可的“应当用于善良,而不是邪恶”)。YAML没有任何此类许可要求,并且这可能是一个重要差异(对于您的律师而言,如果不是您而言)。
{ "": #, [] }
???
来自: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时,您将失去注释。
我发现YAML和JSON都很有效。对我而言,真正决定何时使用一种语言的唯一两件事是一种,即该语言最常使用的语言。例如,如果我使用Java,Javascript,则将使用JSON。对于Java,我将使用他们自己的对象,这些对象几乎是JSON但缺少某些功能,如果需要或首先将其转换为JSON,则将其转换为JSON。我这样做是因为这在Java中很常见,并且使其他Java开发人员更容易修改我的代码。第二件事是我是在程序中使用它来记住属性,还是程序正在接收配置文件形式的指令,在这种情况下,我将使用YAML,因为它很容易被人阅读,具有很好的可读性。看起来很语法,而且很容易修改,即使您不知道YAML的工作原理。然后,程序将读取它并将其转换为JSON或该语言的首选格式。
最后,老实说没关系。任何有经验的程序员都可以轻松阅读JSON和YAML。
JSON无法处理比较yml的大数据
不适合处理不同的多媒体格式。
JSON没有支持“注释”的功能。这可以单独作为附加属性包括在内。
与JSON相比,YAML具有一些优势,例如自引用,对复杂数据类型的支持,嵌入式块文字,注释等。