YAML和JSON之间有什么不同,特别是考虑到以下事情?
性能(编码/解码时间) 内存消耗 表达清晰 库可用性,易用性(我更喜欢C)
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
相关:
应该使用YAML还是JSON来存储Perl数据?
YAML和JSON之间有什么不同,特别是考虑到以下事情?
性能(编码/解码时间) 内存消耗 表达清晰 库可用性,易用性(我更喜欢C)
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
相关:
应该使用YAML还是JSON来存储Perl数据?
当前回答
如果您关心更好的解析速度,那么可以选择将数据存储在JSON中。我必须从其他用户修改文件的位置解析数据,因此我使用YAML,因为与JSON相比,它提供了更好的可读性。 你还可以在YAML文件中添加注释,这在JSON文件中是做不到的。
其他回答
GIT 和 YAML
其他答案都很好。先读这些。但是我还要加上另一个有时使用YAML的原因:git。
越来越多的编程项目使用git存储库进行分发和归档。而且,虽然git回购的历史记录可以同样存储JSON和YAML文件,但用于跟踪和显示文件更改的“diff”方法是面向行的。由于YAML被迫面向行,因此YAML文件中的任何小更改都更容易被人看到。
当然,JSON文件确实可以通过对字符串/键进行排序和添加缩进来“变得漂亮”。但这不是默认的,我很懒。
就我个人而言,我通常使用JSON进行系统到系统的交互。我经常将YAML用于配置文件、静态文件和跟踪文件。(我通常也避免添加YAML关系锚。生命太短暂,没有时间去寻找循环。)
此外,如果速度和空间真的是一个问题,我都不用。你可能想看看BSON。
由于这个问题现在在搜索YAML和JSON时非常突出,值得注意的是两者之间一个很少被引用的区别:许可证。JSON声称拥有一个JSON用户必须遵守的许可(包括法律上模棱两可的“应使用代表善,而不是恶”)。YAML没有这样的许可声明,这可能是一个重要的区别(对您的律师来说,如果不是对您来说)。
差异:
YAML, depending on how you use it, can be more readable than JSON JSON is often faster and is probably still interoperable with more systems It's possible to write a "good enough" JSON parser very quickly Duplicate keys, which are potentially valid JSON, are definitely invalid YAML. YAML has a ton of features, including comments and relational anchors. YAML syntax is accordingly quite complex, and can be hard to understand. It is possible to write recursive structures in yaml: {a: &b [*b]}, which will loop infinitely in some converters. Even with circular detection, a "yaml bomb" is still possible (see xml bomb). Because there are no references, it is impossible to serialize complex structures with object references in JSON. YAML serialization can therefore be more efficient. In some coding environments, the use of YAML can allow an attacker to execute arbitrary code.
观察:
Python programmers are generally big fans of YAML, because of the use of indentation, rather than bracketed syntax, to indicate levels. Many programmers consider the attachment of "meaning" to indentation a poor choice. If the data format will be leaving an application's environment, parsed within a UI, or sent in a messaging layer, JSON might be a better choice. YAML can be used, directly, for complex tasks like grammar definitions, and is often a better choice than inventing a new language.
从技术上讲,YAML提供了比JSON多得多的东西(YAML v1.2是JSON的超集):
评论 锚和继承- 3个相同项目的例子: item1: &anchor_name 名称:测试 title:测试标题 第二条:* anchor_name item3: < <: * anchor_name #你可以添加额外的东西。 ...
大多数情况下,人们不会使用这些额外的功能,主要的区别是YAML使用缩进,而JSON使用括号。这使得YAML(对于训练有素的眼睛)更加简洁和可读。
选择哪一个?
YAML额外的特性和简洁的符号使它成为配置文件(非用户提供的文件)的好选择。 JSON有限的特性、广泛的支持和更快的解析使其成为互操作性和用户提供数据的绝佳选择。
这个问题已经提出6年了,但奇怪的是,没有一个答案真正解决了这四个问题(速度、内存、表现力、可移植性)。
速度
显然,这是依赖于实现的,但由于JSON被广泛使用,而且很容易实现,因此它往往会得到更好的本机支持,从而提高速度。考虑到YAML所做的一切都是JSON所做的,再加上一卡车的工作量,在两者的任何可比实现中,JSON可能会更快。
然而,考虑到YAML文件可能比JSON文件略小(由于“和”字符更少),在特殊情况下,高度优化的YAML解析器可能会更快。
内存
基本上同样的论点适用。如果YAML解析器表示相同的数据结构,那么很难理解为什么YAML解析器的内存效率会比JSON解析器高。
表达能力
正如其他人所指出的,Python程序员倾向于YAML, JavaScript程序员倾向于JSON。以下是我的看法:
记住JSON的整个语法很容易,因此对理解任何JSON文件的含义都很有信心。YAML不是任何人都能真正理解的。微妙之处和边缘情况的数量是极端的。 由于很少有解析器实现整个规范,因此更难确定给定上下文中给定表达式的含义。 在实践中,JSON中缺乏注释是一个真正的痛苦。
可移植性
很难想象没有JSON库的现代语言。也很难想象一个JSON解析器实现任何低于完整规范的东西。YAML有广泛的支持,但没有JSON那么普遍,而且每个解析器实现一个不同的子集。因此YAML文件的互操作性比您想象的要低。
总结
JSON在性能(如果相关的话)和互操作性方面是赢家。YAML更适合人类维护的文件。HJSON是一个不错的折衷方案,尽管可移植性大大降低。JSON5是一种更合理的折衷方案,具有定义良好的语法。