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

时间:2009-11-13 02:42:47

标签: json yaml

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

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

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

相关:

Should I use YAML or JSON to store my Perl data?

17 个答案:

答案 0 :(得分:568)

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

请参阅官方规范,标题为"YAML: Relation to JSON"

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

  • 作为@jdupont pointed out,YAML在视觉上更容易查看。实际上YAML homepage本身就是有效的YAML,但人类很容易阅读。
  • YAML能够使用“锚点”引用YAML文件中的其他项目。因此,它可以处理MySQL数据库中可能找到的关系信息。
  • YAML对于在YAML文件中嵌入其他序列化格式(如JSON或XML )更为健壮。

实际上,最后两点都不会对你或我所做的事情产生影响,但从长远来看,我认为YAML将是一种更健壮,更可行的数据序列化格式。

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

您将找到JSON和YAML的C库。 YAML的图书馆往往更新,但我过去没有遇到任何问题。请参阅示例Yaml-cpp

答案 1 :(得分:163)

的差异:

  1. YAML,取决于您如何使用它,可以比JSON更具可读性
  2. JSON通常是faster,可能仍可与更多系统互操作
  3. 可以非常快速地编写一个“足够好”的JSON解析器
  4. 可能有效JSON的重复密钥肯定是无效的YAML。
  5. YAML有很多功能,包括评论和关系锚点。因此,YAML语法非常复杂,而且很难理解。
  6. 可以在yaml中编写递归结构:{a: &b [*b]},它将在某些转换器中无限循环。即使使用循环检测,仍然可以使用“yaml bomb”(参见xml bomb)。
  7. 由于没有引用,因此无法使用JSON中的对象引用序列化复杂结构。因此,YAML序列化可以更有效。
  8. 在某些编码环境中,使用YAML可以允许攻击者execute arbitrary code
  9. 观察:

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

答案 2 :(得分:74)

绕过深奥的理论

这回答了标题,而不是详细信息,因为大多数只是像谷歌一样在google搜索结果中读取标题,因此我认为有必要从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不使用空格来表示层次结构或分组,并且可以通过删除不必要的空格来轻松展平,以实现更紧凑的传输。
  8. 房间里的大象:互联网本身

    JavaScript显然在网络上占据了很大的优势,JavaScript开发人员更喜欢将JSON作为数据格式与流行的Web API一起使用,因此在进行一般意义上的Web编程时,使用YAML而不是JSON就很难争辩可能在团队环境中被投票。事实上,大多数网络程序员甚至不知道YAML存在,更不用说考虑使用它了。

    如果您正在进行任何Web编程,JSON是默认的方法,因为在使用JavaScript时不需要转换步骤,因此在这种情况下您必须提出更好的参数来使用YAML而不是JSON。

答案 3 :(得分:31)

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

答案 4 :(得分:22)

我发现YAML在眼睛上更容易:更少的括号,“”等等。虽然YAML中有标签的烦恼......但是人们会对它有所了解。

就性能/资源而言,我不希望两者之间存在很大差异。

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

答案 5 :(得分:18)

如果您不需要YAML所具有的任何功能而JSON没有,我更喜欢JSON,因为它非常简单并得到广泛支持(在许多语言中有很多库)。 YAML更复杂,支持更少。我不认为解析速度或内存使用会有很大差异,也许并不是程序性能的重要部分。

答案 6 :(得分:17)

GIT和YAML

其他答案都很好。先读一下。但我有时会添加另一个使用YAML的理由: git

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

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

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

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

答案 7 :(得分:10)

技术上YAML offers a lot more than 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 有限的功能,广泛的支持和更快的解析使其成为互操作性和用户提供的数据的绝佳选择。

答案 8 :(得分:3)

由于此问题现在在搜索YAML和JSON时占据突出地位,因此值得注意的是两者之间很少引用的差异:许可证。 JSON声称有一个license JSON用户必须遵守(包括法律模糊的&#34;将用于Good,而不是Evil&#34;)。 YAML没有这样的许可声明,这可能是一个重要的区别(对你的律师,如果不是你)。

答案 9 :(得分:3)

有时你不必决定一个而不是另一个。

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

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

答案 10 :(得分:3)

基准测试结果

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

JSON的速度要快得多,但会牺牲一些可读性和注释等功能

测试方法

结果

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

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

Perl 5.26.2-043 Dumbbench (Brian D Foy, excludes outliers)
    JSON XS:         0.102
    YAML XS:         0.514
    YAML Syck:       1.027

答案 11 :(得分:1)

  • JSON无法处理大数据。

  • 不适用于处理不同的多媒体格式。

  • JSON不具有支持“注释”的功能。可以单独将其包含为附加属性。

  • YAML与JSON相比具有一些优势,例如自引用,对复杂数据类型的支持,嵌入式块文字,注释等。

  • JSON仅可读,而YAML既可读又可编辑。
  • JSON是YAML的子集,因此YAML解析器可以解析JSON。
  • YAML不使用任何额外的定界符。因此,它比XML和JSON轻巧。

答案 12 :(得分:1)

Javascript 开发者喜欢 JSON,python 开发者喜欢 YMAL

答案 13 :(得分:0)

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

答案 14 :(得分:0)

编程世界,更重要的是,自2009年以来,网络发生了很大变化。我本人更喜欢JSON,而不是YAML,因为我是JavaScript开发人员,前端和后端都使用Node.js,但是许多反对JSON的论点都是无效的npm package hjson

YAML比JSON更加紧凑和简洁,但是开源库hjson在许多语言中提供了两全其美的方式,具有YAML的清晰可读性,但具有JSON的清晰性和结构性。 / p>

以下是JSON,YAML和hjson的示例,它们均表示相同的数据以证明这一点:

JSON

{
  "first_name": "John",
  "last_name": "Smith",
  "age": 25,
  "address": {
    "street_address": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postal_code": "10021"
  },
  "phone_numbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "fax",
      "number": "646 555-4567"
    }
  ],
  "sex": {
    "type": "male"
  }
}

YAML

first_name: John
last_name: Smith
age: 25
address: 
  street_address: 21 2nd Street
  city: New York
  state: NY
  postal code: '10021'
phone_numbers: 
  - type: home
    number: 212 555-1234
  - type: fax
    number: 646 555-4567
sex: 
  type: male

hjson

{
  first_name: John
  last_name: Smith
  age: 25
  address: {
    street_address: 21 2nd Street
    city: New York
    state: NY
    postal_code: 10021
  }
  phone_numbers: [
    {
      type: home
      number: 212 555-1234
    }
    {
      type: fax
      number: 646 555-4567
    }
  ]
  sex: {
    type: male
  }
}

来自Wikipedia

的数据示例

YAML和hjson都允许使用注释,并且可以通过使用保留键字段(即:

)在JSON中潜在地使用

JSON:

{
   "_comment": "comment",
   "key": "field"
}

YAML:

# comment
key: field

hjson:

{
    # comment
    // comment
    /*
        comment
    */
    key: field
}

hjson为注释样式提供了更多选项,包括对多行注释的支持。

hjson还支持多行字符串,并保留制表符:

{
    multilineString:
    '''
    Multiline string
        tabs preserved
    Cool!
    '''
}

JSON是最易于访问的,因为它内置在JavaScript中并且易于在Web上使用,但是hjson可以轻松地安装到Node.js项目中,只需使用:npm install hjson,代替{{1 }}文件扩展名为.json,并将hjson extension安装到VS Code。

您也可以尝试hjson online playground,在hjson和JSON之间转换。

答案 15 :(得分:0)

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

JSON数据格式

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

enter image description here

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

YAML

YAML (YAML不是标记语言)是一种易于使用的数据序列化格式。与JSON一样,YAML(http://yaml.org)是键/值数据格式。该图显示了两者的比较。

enter image description here

请注意以下几点:

  • YAML 中,属性名称和值之间没有双引号(“”)。

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

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

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

答案 16 :(得分:0)

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

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