📄

JSON と YAML と TOML

2023/10/17に公開

はじめに

最近自己学習で、YAML や TOML に触れる機会が増えてきました。

JSON の書き方はわかっているつもりでも、
YAML、TOMLについて触れてこなかった人も少なくはないのではないでしょうか。

JSON と YAML と TOML の書き方の違いから、色々解説していきたいと思います。

JSON

JSONは軽量なデータ交換フォーマットで、データを階層的なキーと値のペアの形式で表現します。
これらのデータは、
ダブルクォートで囲まれた文字列で表現され、数値、真偽値、nullもサポートされています。

データを文字列として変換するのは覚えておいた方が良いですね。

例として、以下のように記述します。

{
   "user": {
      "name": "John",
      "age": 30,
      "isStudent": false,
      "scores": [
         90,
         85,
         88
      ]
   }
}

キーは""(ダブルクォート)で囲う必要があり、キーと値の最後には ,(カンマ)で区切りを入れる必要があります。

以下に基本となる、読み方についてちょこっと触れておきます。

オブジェクト

{}はオブジェクトを意味し、userの中にいくつかの構造が表現されています。

配列

配列は []で表現します。配列内のデータは ,(カンマ)で区切るのがルールです。

YAML

続いてYAMLです。

YAMLは人間が読みやすく書けることを重視したフォーマットで、構造はインデント(スペースやタブ)で表現されます。
また、設定ファイルや文書のマークアップ等に使用されることもあります。

例として、以下のように記述します。

user:
  name: "John"
  age: 30
  isStudent: false
  scores: 
    - 90
    - 85
    - 88

JSONとの違いとしては、キーを""(ダブルクォート)で囲う必要がないことや、
{}ではなく、インデントによってオブジェクトを判別している点が大きな違いかと思います。
キーと値の間を:で表すのはJSONと同じです。

さらにYAMLの特徴として、コメントアウトの記述が可能なことがあげられます。
コメントは#で可能です。

# コメントです
user:
  name: "John"
  age: 30
  isStudent: false
  scores: 
    - 90
    - 85
    - 88

オブジェクト

オブジェクトはインデントを使って表現します。
インデントを使うことで、非常に読みやすくもなると思いますので、習慣づけたいですね。

配列

配列は -で表現されます。
,がないことから、改行の調整等少し注意が必要です。

以下のような書き方は当然おかしくなるのでNGです。

 scores: - 90 - 85 - 88

インデントに注意ですが、オブジェクトの中にオブジェクトがある場合は、以下のように記述します。
friends配列の中に各オブジェクトが存在する場合です。

user:
  name: John
  age: 30
  isStudent: false
  scores:
    - 90
    - 85
    - 88
  friends:
    -
      id: 1
      name: Shota

⇩JSONだとこんな感じ。

{
  "user": {
    "name": "John",
    "age": 30,
    "isStudent": false,
    "scores": [
      90,
      85,
      88
    ],
    "friends": [
      {
        "id": 1,
        "name": "Shota"
      }
    ]
  }
}

TOML

最後にTOMLです。

TOMLは構造化されたデータを表現するためのフォーマットで、
人間が理解しやすく、機械が処理しやすいことを重視しています。

例として、以下のように記述します。

[user]
name = "John"
age = 30
isStudent = false
scores = [ 90, 85, 88 ]

JSONとYAMLとの違いは、キーと値の間の:が必要なく、代わりに=(イコール)で表現されることです。
どちらが好みかはあるかと思いますが、=の方が初心者向けで直感的なのかなと思います。

また、YAMLと同様にコメントアウトの記述も可能です。

# コメントです
[user]
name = "John"
age = 30
isStudent = false
scores = [ 90, 85, 88 ]

オブジェクト(テーブル)

オブジェクトという表現を使っていますが、TOMLではテーブルという表現を使うそうです。
テーブルは[]を記述し、その配下に構造を記述することで表現することができます。
上の例だと [user]がその箇所に該当します。シンプルですね。

配列

配列はJSONと同様の記述方法です。
[]の中に値が入ります。値と値の間に ,が必要となることも同様です。

YAMLと同様に、friends配列にオブジェクトがある場合、以下のように記述します。
user の後ろに .(ドット)区切りでキーを記述するとオブジェクト(テーブル)として認識されます。
クセ強めなので注意が必要かと思います。

[user]
  name = "John"
  age = 30
  isStudent = false
  scores = [90, 85, 88]

[[user.friends]]
  id = 1
  name = "Shota"

⇩JSONだとこんな感じ。

{
  "user": {
    "name": "John",
    "age": 30,
    "isStudent": false,
    "scores": [
      90,
      85,
      88
    ],
    "friends": [
      {
        "id": 1,
        "name": "Shota"
      }
    ]
  }
}

⇩YAMLだとこんな感じ。

user:
  name: John
  age: 30
  isStudent: false
  scores:
    - 90
    - 85
    - 88
  friends:
    -
      id: 1
      name: Shota

おわりに

いかがだったでしょうか。
本記事で紹介したような書き方を真似していただき、理解を深めていただければと思います。

個人的な感想ですが、総合的にみてYAMLが最も直感的なのかなと感じました。
TOMLは.(ドット)の登場で脳みそに?が出ました。ただし慣れの問題でもあると思いますので、
今後回数を重ねるごとに書けるようになってくるかもしれません。

皆さんは、JSON、YAML、TOMLのなかでどれが好みですか?

ではでは!

コラボスタイル Developers

Discussion