详解YAML 和 JSON 的区别

  • Post category:Python

YAML 和 JSON 都是现代常用的数据序列化格式,它们在某些方面相似,但也有一些显著的区别。在本篇攻略中,我们将深入比较 YAML 和 JSON 的区别。

YAML 和 JSON 的概述

  • YAML 是 “YAML Ain’t Markup Language”(YAML 不是标记语言)的递归缩写。它是一种字符串表示数据的文件格式,最初为了弥补 JSON 文件在显示上的缺陷而设计。YAML在表达时着重于易读性和便于人类理解,支持类似自然语言的表达方式,拥有更丰富的处理结构和语义功能;
  • JSON 是 “JavaScript Object Notation”(JavaScript 对象标记)的缩写,它是一种轻量级的数据交换格式。原始文件和文本中的数据结构是以键值对的形式进行描述的一般数据表示形式。

YAML 和 JSON 的差异

以下是 YAML 和 JSON 之间的主要区别。

整体结构

YAML 通常使用嵌套的缩进结构来定义数据结构层次,这使得 YAML 文件在视觉上更加易于阅读,例如:

person:
  name: John
  age: 30
  address:
    street: 21 2nd Street
    city: New York
    state: NY
    zip: "10021-3100"

相反,JSON 中键值对通常使用花括号和方括号,例如:

{
  "person": {
    "name": "John",
    "age": 30,
    "address": {
      "street": "21 2nd Street",
      "city": "New York",
      "state": "NY",
      "zip": "10021-3100"
    }
  }
}

从以上代码可以看出:

  • 在 JSON 中,每一组键值对需要用逗号分隔,而在 YAML 中,这是不必要的。
  • JSON 使用双引号字符来表示字符串,虽然可以使用单引号,但这并不是正规的 JSON 表示形式。YAML 中可以使用单引号或双引号,将字符串表示为标量。

数据类型

YAML 支持更多的数据类型,例如常规类型、对象、maps、列表等。YAML 还有丰富的表达方式,例如RUBY、PERL、PYTHON等支持的shell变量类表现方式,比如:

defaults: &defaults
  adapter: postgresql
  host: localhost

development:
  database: myapp_development
  <<: *defaults

test:
  database: myapp_test
  <<: *defaults

这里使用了“锚点”和“引用”,以便在 YAML 中使用相同的对象。

相反,JSON 支持的基本数据类型更少,只有字符串,数字,布尔值和空值。虽然可以将数组和对象表示为键值对,但 JSON 不支持 map 类型。

{
  "colors": [
    {
      "color": "black",
      "category": "hue",
      "type": "primary",
      "code": {
        "rgba": [255,255,255,1],
        "hex": "#000"
      }
    },
    {
      "color": "white",
      "category": "value",
      "code": {
        "rgba": [0,0,0,1],
        "hex": "#FFF"
      }
    }
  ]
}

注释

YAML 能够很好地支持注释,在 YAML 文件中可以使用 #

# User Database Information
user_db:
  host: localhost
  port: 3306
  user: root
  password: password  # remember to change this

相反,JSON 不支持注释。

代码块表示法

在 YAML 中,可以使用代码块的表示法来表示复杂的结构,例如:

yaml_code: |
    some_text_block
    with multiple lines
    and line breaks ...

用于代码段的竖杠 | 字符使 YML 代码更易于阅读。

而在 JSON 中,没有类似于 YAML 中代码块表示法的东西。

示例说明

现在我们通过两个示例阐明YAML 和 JSON的差异,这将更加具体地展示这两种格式的区别。

首先我们看一个yaml示例:

name: Jonathan
age: 25
city: San Francisco
languages:
  - English
  - Spanish
birth_date: 1996-10-20

现在我们将其转换为JSON格式:

{
  "name": "Jonathan",
  "age": 25,
  "city": "San Francisco",
  "languages": [
    "English",
    "Spanish"
  ],
  "birth_date": "1996-10-20"
}

我们可以看到 JSON 中缺少 YAML 中的缩进,而且使用了逗号分隔符。

再看另一个示例,这是一个 YAML 的示例:

users:
  - name: Alice
    age: 20
    interests:
      - hiking
      - diving
  - name: Bob
    age: 25
    interests:
      - reading
      - painting

我们使用相同的数据在 JSON 格式中表示如下:

{
  "users": [
    {
      "name": "Alice",
      "age": 20,
      "interests": [
        "hiking",
        "diving"
      ]
    },
    {
      "name": "Bob",
      "age": 25,
      "interests": [
        "reading",
        "painting"
      ]
    }
  ]
}

可以发现,与 YAML 相比,数据在 JSON 中使用了更多的符号,但它们同时是对于同样的数据的表示。

综上,YAML 和 JSON 之间的区别在于它们表示相同数据的方式、使用字符的数量、类型的多样性和代码块表示法等特性。无论何种格式都有它们的优缺点,根据情况选择适合的格式是重要的。