YAML 和 JSON 有什么区别,具体考虑以下几点?
- 性能(编码/解码时间)
- 内存消耗
- 表达清晰
- 库可用性,易用性(我更喜欢 C)
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
YAML 和 JSON 有什么区别,具体考虑以下几点?
我打算在我们的嵌入式系统中使用这两个中的一个来存储配置文件。
从技术上讲,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 炸弹)。观察:
这回答了标题,而不是细节,因为大多数人像我一样只是从谷歌的搜索结果中阅读标题,所以我觉得有必要从 Web 开发人员的角度进行解释。
JavaScript 如此明显地以巨大的优势主导了 Web,JavaScript 开发人员绝大多数都更喜欢使用 JSON 作为数据格式以及流行的 Web API,因此在进行一般意义上的 Web 编程时,很难争论使用 YAML 而不是 JSON,因为你可能会被否决在团队环境中。事实上,大多数 Web 程序员甚至都不知道 YAML 的存在,更不用说考虑使用它了。
如果你正在做任何网络编程,JSON 是默认的方式,因为在使用 JavaScript 时不需要翻译步骤,所以在这种情况下你必须想出一个更好的论点来使用 YAML 而不是 JSON。
这个问题已有 6 年的历史,但奇怪的是,没有一个答案真正解决了所有四点(速度、内存、表现力、可移植性)。
显然,这是依赖于实现的,但由于 JSON 使用如此广泛,而且如此易于实现,它往往会获得更大的原生支持,从而提高速度。考虑到 YAML 可以完成 JSON 所做的所有事情,再加上一卡车,很可能在两者的任何可比实现中,JSON 会更快。
但是,鉴于 YAML 文件可能比其对应的 JSON 文件略小(由于"
和,
字符较少),高度优化的 YAML 解析器可能会在特殊情况下更快。
基本上同样的论点也适用。如果 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 (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,因为它非常简单并且得到广泛支持(具有多种语言的大量库)。YAML 更复杂,支持更少。我认为解析速度或内存使用不会有太大不同,而且可能不是程序性能的重要组成部分。
来自: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时,您会丢失注释。
下面是在 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
由于这个问题现在在搜索 YAML 和 JSON 时非常突出,因此值得注意的是两者之间很少被引用的区别:许可证。JSON 声称拥有 JSON 用户必须遵守的许可证(包括法律上模棱两可的“应用于善,而非恶”)。YAML 没有这样的许可要求,这可能是一个重要的区别(对你的律师,如果不是对你)。
有时您不必为其中一个做出决定。
例如,在 Go 中,您可以同时拥有两者:
type Person struct {
Name string `json:"name" yaml:"name"`
Age int `json:"age" yaml:"age"`
}
我发现 YAML 和 JSON 都非常有效。对我来说,真正决定何时使用一种而不是另一种的唯一两件事是,该语言最常用于哪种语言。例如,如果我使用 Java、Javascript,我将使用 JSON。对于 Java,我将使用他们自己的对象,这些对象几乎是 JSON,但缺少某些功能,如果需要,我将其转换为 JSON,或者首先将其转换为 JSON。我这样做是因为这在 Java 中很常见,并且使其他 Java 开发人员更容易修改我的代码。第二件事是我是否使用它让程序记住属性,或者程序是否以配置文件的形式接收指令,在这种情况下我将使用 YAML,因为它很容易被人类阅读,很好看起来语法,并且很容易修改,即使你不知道 YAML 是如何工作的。然后,程序将读取它并将其转换为 JSON 或该语言首选的任何内容。
最后,老实说,这并不重要。任何有经验的程序员都可以轻松阅读 JSON 和 YAML。
如果您担心更好的解析速度,则可以选择将数据存储在 JSON 中。我必须从文件可能受到其他用户修改的位置解析数据,因此我使用了 YAML,因为与 JSON 相比,它提供了更好的可读性。您还可以在 YAML 文件中添加无法在 JSON 文件中完成的注释。