863

YAML 和 JSON 有什么区别,具体考虑以下几点?

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

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

有关的:

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

4

14 回答 14

759

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

请参阅标题为“YAML:与 JSON的关系”的部分中的官方规范。

一般来说,我喜欢 YAML 的某些东西在 JSON 中不可用。

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

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

目前,AJAX 和其他 Web 技术倾向于使用 JSON。YAML 目前更多地用于离线数据处理。例如,它默认包含在基于 C 的 OpenCV 计算机视觉包中,而 JSON 则不包含。

您将找到适用于 JSON 和 YAML 的 C 库。YAML 的库往往较新,但过去我对它们没有任何问题。参见例如Yaml-cpp

于 2009-11-13T14:28:02.737 回答
252

差异:

  1. YAML,取决于你如何使用它,可能比 JSON 更具可读性
  2. JSON 通常更快,并且可能仍可与更多系统互操作
  3. 可以非常快速地编写一个“足够好”的 JSON 解析器
  4. 可能是有效 JSON 的重复键绝对是无效的 YAML。
  5. YAML 有很多功能,包括评论和关系锚。YAML 语法因此相当复杂,并且可能难以理解。
  6. 可以在 yaml: 中编写递归结构{a: &b [*b]},这将在某些转换器中无限循环。即使使用循环检测,“yaml 炸弹”仍然是可能的(参见xml 炸弹)。
  7. 因为没有引用,所以不可能用 JSON 中的对象引用序列化复杂的结构。YAML 序列化因此可以更有效。
  8. 在某些编码环境中,使用 YAML 可以让攻击者执行任意代码

观察:

  1. Python 程序员通常是 YAML 的忠实拥护者,因为使用缩进而不是括号语法来表示级别。
  2. 许多程序员认为将“意义”附加到缩进是一个糟糕的选择。
  3. 如果数据格式将离开应用程序的环境、在 UI 中解析或在消息传递层中发送,那么 JSON 可能是更好的选择。
  4. YAML 可以直接用于语法定义等复杂任务,并且通常是比发明新语言更好的选择。
于 2013-06-07T14:17:53.407 回答
114

绕过深奥的理论

这回答了标题,而不是细节,因为大多数人像我一样只是从谷歌的搜索结果中阅读标题,所以我觉得有必要从 Web 开发人员的角度进行解释。

  1. YAML 使用空格缩进,这是 Python 开发人员熟悉的领域。
  2. JavaScript 开发人员喜欢 JSON,因为它是 JavaScript 的子集,可以在 JavaScript 中直接解释和编写,同时使用简写方式声明 JSON,在使用不带空格的典型变量名时不需要在键中使用双引号。
  3. 有大量的解析器在 YAML 和 JSON 的所有语言中都能很好地工作。
  4. YAML 的空间格式在许多情况下更容易查看,因为格式化需要一种更易于阅读的方法。
  5. 如果您的编辑器中没有可见的空间格式,YAML 的表单虽然更紧凑且更易于查看,但可能很难手动编辑。制表符不是空格,因此如果您没有编辑器将击键解释为空格,则会进一步混淆。
  6. JSON 的序列化和反序列化速度要快得多,因为要检查的功能比 YAML 少得多,这使得处理 JSON 的代码更小更轻。
  7. 一个常见的误解是 YAML 需要更少的标点符号并且比 JSON 更紧凑,但这是完全错误的。空格是不可见的,因此看起来字符更少,但是如果您计算正确解释 YAML 所必需的实际空格以及适当的缩进,您会发现 YAML 实际上需要比 JSON 更多的字符。JSON 不使用空格来表示层次结构或分组,并且可以通过删除不必要的空格轻松扁平化以实现更紧凑的传输。

房间里的大象:互联网本身

JavaScript 如此明显地以巨大的优势主导了 Web,JavaScript 开发人员绝大多数都更喜欢使用 JSON 作为数据格式以及流行的 Web API,因此在进行一般意义上的 Web 编程时,很难争论使用 YAML 而不是 JSON,因为你可能会被否决在团队环境中。事实上,大多数 Web 程序员甚至都不知道 YAML 的存在,更不用说考虑使用它了。

如果你正在做任何网络编程,JSON 是默认的方式,因为在使用 JavaScript 时不需要翻译步骤,所以在这种情况下你必须想出一个更好的论点来使用 YAML 而不是 JSON。

于 2016-01-23T02:40:49.883 回答
63

这个问题已有 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是一种更合理的折衷方案,具有明确定义的语法。

于 2016-04-12T13:36:40.930 回答
48

GIT 和 YAML

其他答案都很好。先读那些。但有时我会添加另一个使用 YAML 的原因:git

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

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

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

另外,如果速度和空间真的很重要,我也不使用。你可能想看看 BSON。

于 2018-03-23T19:35:46.350 回答
25

我发现 YAML 在视觉上更容易:更少的括号、“”等。虽然 YAML 中的制表符很烦人……但人们已经掌握了窍门。

在性能/资源方面,我预计两者之间不会有很大差异。

此外,我们正在讨论配置文件,所以我不希望编码/解码活动的频率很高,不是吗?

于 2009-11-13T02:46:45.727 回答
23

从技术上讲, 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有限的功能、广泛的支持和更快的解析使其成为互操作性和用户提供数据的绝佳选择。
于 2016-03-03T13:31:22.893 回答
22

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

于 2009-11-13T02:50:50.383 回答
12

来自:Arnaud Lauret 的书“Web API 的设计”。:

JSON 数据格式

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

在此处输入图像描述

对象由大括号 ({}) 分隔。名称是带引号的字符串(“名称”),并用冒号 (:) 与其值隔开。值可以是像“值”这样的字符串、像 1.23 这样的数字、布尔值(真或假)、空值 null、对象或数组。数组由方括号 ([]) 分隔,其值由逗号 (,) 分隔。使用任何编程语言都可以轻松解析JSON格式。它也相对容易读写。它被广泛用于许多用途,例如数据库、配置文件,当然还有 API。

YAML

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

在此处输入图像描述

请注意以下几点:

  • YAML中的属性名称和值周围没有双引号 (" ") 。

  • JSON 的结构花括号 ({}) 和逗号 (,) 在YAML中被换行符和缩进替换。

  • 数组括号 ([]) 和逗号 (,) 被 YAML中的破折号 (-) 和换行符替换。

  • JSON不同,YAML允许以井号 (#) 开头的注释。将其中一种格式转换为另一种格式相对容易。不过请注意,将YAML文档转换为JSON时,您会丢失注释。

于 2019-10-21T15:08:08.723 回答
12

基准测试结果

下面是在 Python 和 Perl 上比较 YAML 和 JSON 加载时间的基准测试结果

JSON 更快,但牺牲了一些可读性和注释等功能

测试方法

结果

Python 3.8.3 timeit
    JSON:            0.108
    YAML CLoader:    3.684
    YAML:           29.763

Perl 5.26.2 Benchmark::cmpthese
    JSON XS:         0.107
    YAML XS:         0.574
    YAML Syck:       1.050

Perl 5.26.2 Dumbbench (Brian D Foy, excludes outliers)
    JSON XS:         0.102
    YAML XS:         0.514
    YAML Syck:       1.027
于 2020-07-10T22:13:14.427 回答
7

由于这个问题现在在搜索 YAML 和 JSON 时非常突出,因此值得注意的是两者之间很少被引用的区别:许可证。JSON 声称拥有 JSON 用户必须遵守的许可证(包括法律上模棱两可的“应用于善,而非恶”)。YAML 没有这样的许可要求,这可能是一个重要的区别(对你的律师,如果不是对你)。

于 2016-09-20T07:18:59.457 回答
6

有时您不必为其中一个做出决定。

例如,在 Go 中,您可以同时拥有两者:

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}
于 2017-03-29T14:00:43.377 回答
3

我发现 YAML 和 JSON 都非常有效。对我来说,真正决定何时使用一种而不是另一种的唯一两件事是,该语言最常用于哪种语言。例如,如果我使用 Java、Javascript,我将使用 JSON。对于 Java,我将使用他们自己的对象,这些对象几乎是 JSON,但缺少某些功能,如果需要,我将其转换为 JSON,或者首先将其转换为 JSON。我这样做是因为这在 Java 中很常见,并且使其他 Java 开发人员更容易修改我的代码。第二件事是我是否使用它让程序记住属性,或者程序是否以配置文件的形式接收指令,在这种情况下我将使用 YAML,因为它很容易被人类阅读,很好看起来语法,并且很容易修改,即使你不知道 YAML 是如何工作的。然后,程序将读取它并将其转换为 JSON 或该语言首选的任何内容。

最后,老实说,这并不重要。任何有经验的程序员都可以轻松阅读 JSON 和 YAML。

于 2016-12-06T00:52:30.470 回答
1

如果您担心更好的解析速度,则可以选择将数据存储在 JSON 中。我必须从文件可能受到其他用户修改的位置解析数据,因此我使用了 YAML,因为与 JSON 相比,它提供了更好的可读性。您还可以在 YAML 文件中添加无法在 JSON 文件中完成的注释。

于 2021-04-21T07:03:42.357 回答