json比較 - yml文件




YAML和JSON有什么区别? 什么时候比较喜欢一个 (8)

GIT和YAML

其他答案很好。 先阅读那些。 但是我会添加另一个使用YAML的理由: git

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

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

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

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

我们何时应该使用YAML而不是JSON,反之亦然,考虑以下事项?

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

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

有关:

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


绕过深奥的理论

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

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

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

JavaScript明显地占据了网络的巨大利润,JavaScript开发人员更喜欢将JSON作为数据格式与流行的Web API一起使用,因此,在一般意义上进行Web编程时,很难争论使用YAML而不是JSON,因为您可能会被超出在团队环境中。 事实上,大多数网络程序员甚至都不知道YAML存在,更不用说考虑使用YAML了。

如果您正在进行任何Web编程,那么JSON是默认的解决方法,因为在使用JavaScript时不需要执行翻译步骤,因此您必须提出更好的参数,以便在这种情况下使用YAML。


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


我发现YAML和JSON都非常有效。 当一个人在另一个人身上使用的时候,唯一的两个事情就是一个,这个语言最常用的是什么。 例如,如果我使用Java,Javascript,我将使用JSON。 对于Java,我将使用他们自己的对象,这些对象几乎都是JSON,但缺少一些功能,如果需要或者将它转换为JSON,则将其转换为JSON。 我这样做是因为这在Java中是很常见的事情,并且使其他Java开发人员更容易修改我的代码。 第二件事是我是否使用它来记录属性,或者程序是否以配置文件的形式接收指令,在这种情况下,我将使用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有限的功能,广泛的支持和更快的解析功能使其成为互操作性和用户提供数据的绝佳选择。

技术上,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


由于这个问题现在在搜索YAML和JSON时显着突出,所以值得注意的是两者之间很少引用的区别:许可证。 JSON声称拥有JSON用户必须遵守的license (包括合法歧义的“应当用于善良而不是邪恶”)。 YAML不提供这样的许可证声明,这可能是一个重要的区别(对你的律师,如果不是你)。


这个问题已经有6年了,但奇怪的是,没有一个答案能够真正解决所有四个问题(速度,记忆,表现力,可移植性)。

速度

显然这是依赖于实现的,但是由于JSON的使用非常广泛,并且易于实现,所以它倾向于获得更大的本地支持,因此速度更快。 考虑到YAML可以处理JSON所做的一切事情,再加上更多的卡车负载,所以两者的任何类似实现都可能相同,JSON会更快。

但是,由于YAML文件可能比其JSON对应文件略小(由于""字符少),所以在特殊情况下,高度优化的YAML解析器可能会更快。

记忆

基本上同样的论点适用。 很难理解为什么YAML解析器比JSON解析器更具有内存效率,如果它们表示相同的数据结构。

表现

正如其他人所指出的那样,Python程序员倾向于倾向于使用YAML,JavaScript程序员使用JSON。 我会做出这些观察:

  • 记住JSON的整个语法很容易,因此对理解任何JSON文件的含义非常有信心。 任何人都不能真正理解YAML。 微妙和边缘情况的数量是极端的。
  • 因为很少有解析器实现整个规范,所以在给定的上下文中更难确定给定表达式的含义。
  • 在JSON中缺乏评论实际上是一个真正的痛苦。

可移植性

很难想象没有JSON库的现代语言。 也很难想象JSON解析器实现的任何东西都不到全规格。 YAML有广泛的支持,但比JSON更普遍,每个解析器都实现了不同的子集。 因此,YAML文件的互操作性比您想象的要小。

概要

JSON是性能(如果相关)和互操作性的优胜者。 YAML更适合用于人员维护的文件。 HJSON是一个体面的妥协,虽然可携带性大大降低。 JSON5是一个更合理的折衷方案,具有定义良好的语法。







yaml