YAML和JSON之间有什么不同,特别是考虑到以下事情?

性能(编码/解码时间) 内存消耗 表达清晰 库可用性,易用性(我更喜欢C)

我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。

相关:

应该使用YAML还是JSON来存储Perl数据?


当前回答

摘自:Arnaud Lauret的书《Web api的设计》。”:

JSON数据格式

JSON是一种基于JavaScript编程语言描述数据的文本数据格式,尽管它的名字是JSON,但它完全独立于语言(参见https://www.json.org/)。使用JSON,可以描述包含无序名称/值对的对象,也可以描述包含有序值的数组或列表,如图所示。

An object is delimited by curly braces ({}). A name is a quoted string ("name") and is sep- arated from its value by a colon (:). A value can be a string like "value", a number like 1.23, a Boolean (true or false), the null value null, an object, or an array. An array is delimited by brackets ([]), and its values are separated by commas (,). The JSON format is easily parsed using any programming language. It is also relatively easy to read and write. It is widely adopted for many uses such as databases, configura- tion files, and, of course, APIs.

YAML

YAML (YAML Ain 't Markup Language)是一种人性化的数据序列化格式。和JSON一样,YAML (http://yaml.org)也是一种键/值数据格式。该图显示了两者的比较。

注意以下几点:

在YAML中,属性名和值周围没有双引号(“”)。 JSON的结构花括号({})和逗号(,)被换行符和取代 YAML的压痕。 数组中的括号([])和逗号(,)被破折号(-)和换行符取代 YAML。 与JSON不同,YAML允许以#开头的注释。 将其中一种格式转换为另一种格式相对容易。不过要预先警告,在将YAML文档转换为JSON时会丢失注释。

其他回答

如果您关心更好的解析速度,那么可以选择将数据存储在JSON中。我必须从其他用户修改文件的位置解析数据,因此我使用YAML,因为与JSON相比,它提供了更好的可读性。 你还可以在YAML文件中添加注释,这在JSON文件中是做不到的。

如果你不需要YAML有而JSON没有的任何特性,我更喜欢JSON,因为它非常简单,并且得到广泛支持(有很多语言的库)。YAML更复杂,支持更少。我不认为解析速度或内存使用会有太大的不同,而且可能不是程序性能的主要部分。

从技术上讲,YAML是JSON的超集。这意味着,至少在理论上,YAML解析器可以理解JSON,但不一定反过来。

在“YAML:与JSON的关系”一节中可以看到官方规范。

总的来说,我喜欢YAML的某些东西是JSON中没有的。

正如@jdupont指出的,YAML在视觉上更容易看。事实上,YAML主页本身就是有效的YAML,但是它很容易被人阅读。 YAML能够使用“锚”引用YAML文件中的其他项。因此,它可以像在MySQL数据库中一样处理关系信息。 YAML在YAML文件中嵌入其他序列化格式(如JSON或XML)方面更加健壮。

在实践中,最后两点可能对您或我所做的事情都不重要,但从长远来看,我认为YAML将是一种更健壮、更可行的数据序列化格式。

现在,AJAX和其他web技术倾向于使用JSON。YAML目前更多地用于脱机数据处理。例如,它默认包含在基于c语言的OpenCV计算机视觉包中,而JSON则没有。

您将发现JSON和YAML的C库。YAML的库往往更新,但我过去使用它们没有遇到过麻烦。参见Yaml-cpp的例子。

GIT 和 YAML

其他答案都很好。先读这些。但是我还要加上另一个有时使用YAML的原因:git。

越来越多的编程项目使用git存储库进行分发和归档。而且,虽然git回购的历史记录可以同样存储JSON和YAML文件,但用于跟踪和显示文件更改的“diff”方法是面向行的。由于YAML被迫面向行,因此YAML文件中的任何小更改都更容易被人看到。

当然,JSON文件确实可以通过对字符串/键进行排序和添加缩进来“变得漂亮”。但这不是默认的,我很懒。

就我个人而言,我通常使用JSON进行系统到系统的交互。我经常将YAML用于配置文件、静态文件和跟踪文件。(我通常也避免添加YAML关系锚。生命太短暂,没有时间去寻找循环。)

此外,如果速度和空间真的是一个问题,我都不用。你可能想看看BSON。

有时候你不需要在两者之间做出选择。

例如,在围棋中,你可以同时拥有这两者:

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}