YAMLのデータ型を完全マスター【設定ファイルの書き方ガイド】

「YAMLファイルで文字列を書いたら、勝手に数値として認識された…」
「複数行のテキストを書きたいけど、どう書けばいいの?」

YAMLは設定ファイルとして人気がありますが、データ型の扱いで戸惑うことってありますよね。引用符が必要なのか不要なのか、どう書けば配列になるのか、意外と奥が深いんです。

この記事では、YAMLで使えるデータ型を基礎から応用まで徹底的に解説していきます。初心者の方も、すでにYAMLを使っている方も、きっと新しい発見があるはずですよ!


スポンサーリンク

YAMLとは?基礎知識

YAMLの特徴

YAML(ヤムル、ヤメルと読みます)は、YAML Ain’t Markup Languageの略で、人間が読み書きしやすいデータ形式です。

YAMLの主な特徴:

  • インデント(字下げ)で階層構造を表現
  • 記号が少なく、シンプルで読みやすい
  • コメントが書ける
  • JSONと互換性がある(YAMLはJSONのスーパーセット)

よく使われる場面:

  • Dockerの設定ファイル(docker-compose.yml)
  • Kubernetesの設定
  • CI/CDツール(GitHub Actions、GitLab CI)
  • アプリケーションの設定ファイル

JSONとの比較

同じデータをJSONとYAMLで表現してみましょう。

JSON:

{
  "name": "太郎",
  "age": 25,
  "hobbies": ["読書", "プログラミング"]
}

YAML:

name: 太郎
age: 25
hobbies:
  - 読書
  - プログラミング

YAMLの方が、括弧やカンマが少なくてスッキリしていますね。


YAMLの3つの基本データ型

YAMLには、大きく分けて3種類のデータ型があります。

1. スカラー(単一の値)

スカラーとは、一つの値を表すデータです。

含まれるもの:

  • 文字列(テキスト)
  • 数値(整数、小数)
  • ブール値(真偽値)
  • null(何もない値)
name: 田中太郎        # 文字列
age: 30               # 整数
height: 175.5         # 小数
is_active: true       # ブール値
middle_name: null     # null

2. シーケンス(配列・リスト)

シーケンスは、複数の値を順番に並べたものです。

fruits:
  - りんご
  - バナナ
  - みかん

配列やリストと同じ概念です。

3. マッピング(連想配列・辞書)

マッピングは、キーと値の組み合わせです。

person:
  name: 田中太郎
  age: 30
  city: 東京

オブジェクトや辞書と同じ概念になります。


文字列の書き方

引用符なしの文字列

最もシンプルな書き方です。

name: 田中太郎
message: Hello World
city: Tokyo

使える条件:

  • 特殊文字が含まれない
  • 先頭や末尾に空白がない
  • 数値やブール値と間違われない

シングルクォートで囲む

特殊文字を含む場合、シングルクォート(’)で囲みます。

message: 'これは"引用"です'
special: '#ハッシュタグ'
colon: 'key: value'

特徴:

  • エスケープシーケンス(\nなど)が使えない
  • シングルクォート自体を含める場合は2つ重ねる
quote: 'It''s a beautiful day'
# 結果:It's a beautiful day

ダブルクォートで囲む

エスケープシーケンスを使いたい場合は、ダブルクォート(”)を使います。

message: "改行を含む\nテキスト"
path: "C:\\Users\\Admin"
tab: "タブ\t区切り"
unicode: "絵文字\u263A"

使えるエスケープシーケンス:

  • \n:改行
  • \t:タブ
  • \\:バックスラッシュ
  • \":ダブルクォート
  • \uXXXX:Unicode文字

複数行の文字列(リテラルスタイル)

縦棒(|)を使うと、改行をそのまま保持します。

description: |
  これは複数行の
  テキストです。
  改行もそのまま保存されます。

出力結果:

これは複数行の
テキストです。
改行もそのまま保存されます。

最後に改行が入ります。

複数行の文字列(折りたたみスタイル)

大なり記号(>)を使うと、改行がスペースに置き換わります。

summary: >
  これは長い
  テキストですが
  一行になります。

出力結果:

これは長い テキストですが 一行になります。

長い文章を読みやすく整形したい時に便利です。

文字列と認識されやすい落とし穴

以下のような値は、文字列以外に解釈される可能性があります。

# これらは引用符で囲むべき
version: "1.0"      # 囲まないと数値の1.0になる
postal: "100-0001"  # 囲まないと計算されてしまう可能性
yes_no: "yes"       # 囲まないとブール値のtrueになる
time: "12:30"       # 囲まないと時刻データ型になる可能性

数値の書き方

整数

普通に数字を書くだけです。

age: 30
count: 100
negative: -15
zero: 0

進数表記も可能:

octal: 0o755       # 8進数
hexadecimal: 0xFF  # 16進数

小数

小数点を使います。

height: 175.5
pi: 3.14159
temperature: -5.2

指数表記

科学的記数法も使えます。

large_number: 1.5e+10    # 15000000000
small_number: 2.5e-3     # 0.0025

特殊な数値

無限大や非数(NaN)も表現できます。

infinity: .inf
negative_infinity: -.inf
not_a_number: .nan

ブール値(真偽値)

真か偽かを表すデータ型です。

true(真)の書き方

is_active: true
is_valid: True
is_enabled: TRUE
is_ok: yes
is_ready: Yes
is_on: on

全て「真」として認識されます。

false(偽)の書き方

is_disabled: false
is_invalid: False
is_off: FALSE
is_ng: no
is_not_ready: No
is_off: off

全て「偽」として認識されます。

注意点

意図せずブール値になることがあります。

# これはブール値のtrueになってしまう
answer: yes

# 文字列として扱いたい場合
answer: "yes"

「yes」「no」「on」「off」などを文字列として使う場合は、必ず引用符で囲みましょう。


null(空値)

値が存在しないことを表します。

middle_name: null
nickname: Null
alias: NULL
unknown: ~        # チルダも null として扱われる
empty:            # 値を書かない場合も null

使用場面:

  • オプション項目で値がない場合
  • データベースのNULL値に対応
  • 未設定の状態を明示
person:
  first_name: 太郎
  middle_name: null
  last_name: 田中

配列(シーケンス)の書き方

ハイフンを使った書き方

最も一般的な配列の書き方です。

fruits:
  - りんご
  - バナナ
  - みかん

インデントの注意:

# 正しい
items:
  - item1
  - item2

# 間違い(インデントがずれている)
items:
- item1
- item2

インライン形式

一行で書くこともできます。

fruits: [りんご, バナナ, みかん]
numbers: [1, 2, 3, 4, 5]

短い配列の場合、こちらの方が読みやすいこともあります。

入れ子になった配列

配列の中に配列を入れることもできます。

matrix:
  - [1, 2, 3]
  - [4, 5, 6]
  - [7, 8, 9]

または:

nested:
  -
    - a
    - b
  -
    - c
    - d

空の配列

empty_array: []

# または
empty_list:

オブジェクト(マッピング)の書き方

基本的な書き方

キーと値をコロンで区切ります。

person:
  name: 田中太郎
  age: 30
  email: tanaka@example.com

注意点:

  • コロンの後には必ずスペースが必要
  • インデントはスペースを使う(タブは使えない)
  • インデント幅は統一する(通常2スペース)

インライン形式

一行で書くこともできます。

person: {name: 田中太郎, age: 30, city: 東京}

入れ子構造

オブジェクトの中にオブジェクトを入れられます。

company:
  name: ABC株式会社
  address:
    postal_code: 100-0001
    prefecture: 東京都
    city: 千代田区
  contact:
    phone: 03-1234-5678
    email: info@abc.co.jp

階層構造を表現するのに便利です。


複雑なデータ構造

オブジェクトの配列

よく使われるパターンです。

users:
  - name: 田中太郎
    age: 30
    role: admin
  - name: 佐藤花子
    age: 25
    role: user
  - name: 鈴木一郎
    age: 35
    role: moderator

配列を含むオブジェクト

team:
  name: 開発チーム
  members:
    - 田中太郎
    - 佐藤花子
    - 鈴木一郎
  technologies:
    - Python
    - JavaScript
    - Docker

混在した構造

project:
  name: Webアプリ開発
  start_date: 2024-01-01
  team:
    leader: 田中太郎
    members:
      - 佐藤花子
      - 鈴木一郎
  tasks:
    - id: 1
      title: 設計
      status: 完了
    - id: 2
      title: 開発
      status: 進行中

アンカーとエイリアス(参照機能)

同じ内容を複数箇所で使いたい場合、参照機能が便利です。

基本的な使い方

# &でアンカー(参照元)を定義
default_settings: &defaults
  timeout: 30
  retry: 3

# *でエイリアス(参照先)を使用
production:
  <<: *defaults
  host: prod.example.com

development:
  <<: *defaults
  host: dev.example.com

展開結果:

production:
  timeout: 30
  retry: 3
  host: prod.example.com

development:
  timeout: 30
  retry: 3
  host: dev.example.com

配列での使用

# 共通の設定を定義
common_env: &common
  - DB_HOST=localhost
  - API_KEY=secret

# 各環境で使用
production_env:
  - *common
  - ENV=production

development_env:
  - *common
  - ENV=development

上書きも可能

base: &base
  name: 基本設定
  timeout: 30

custom:
  <<: *base
  timeout: 60  # 上書き
  extra: 追加設定

結果:

custom:
  name: 基本設定
  timeout: 60
  extra: 追加設定

プログラミング言語での扱い方

Python(PyYAML)

Pythonで最も人気のあるYAMLライブラリです。

import yaml

# YAMLを読み込む
with open('config.yaml', 'r', encoding='utf-8') as file:
    data = yaml.safe_load(file)

# データ型が自動的に変換される
print(data['name'])        # 文字列
print(data['age'])         # 整数
print(data['is_active'])   # ブール値
print(data['hobbies'])     # リスト

# YAMLとして書き出す
output_data = {
    'name': '田中太郎',
    'age': 30,
    'hobbies': ['読書', 'プログラミング']
}

with open('output.yaml', 'w', encoding='utf-8') as file:
    yaml.dump(output_data, file, allow_unicode=True)

JavaScript(js-yaml)

Node.jsでYAMLを扱う場合です。

const yaml = require('js-yaml');
const fs = require('fs');

// YAMLを読み込む
try {
  const data = yaml.load(fs.readFileSync('config.yaml', 'utf8'));
  console.log(data.name);     // 文字列
  console.log(data.age);      // 数値
  console.log(data.hobbies);  // 配列
} catch (e) {
  console.error(e);
}

// JavaScriptオブジェクトをYAMLに変換
const obj = {
  name: '田中太郎',
  age: 30,
  hobbies: ['読書', 'プログラミング']
};

const yamlStr = yaml.dump(obj);
fs.writeFileSync('output.yaml', yamlStr);

Ruby

Rubyは標準ライブラリでYAMLをサポートしています。

require 'yaml'

# YAMLを読み込む
data = YAML.load_file('config.yaml')
puts data['name']        # 文字列
puts data['age']         # 整数
puts data['hobbies']     # 配列

# RubyオブジェクトをYAMLに変換
hash = {
  'name' => '田中太郎',
  'age' => 30,
  'hobbies' => ['読書', 'プログラミング']
}

File.write('output.yaml', hash.to_yaml)

よくある間違いと注意点

間違い1:タブを使ってしまう

# ✕ ダメな例(タブを使用)
person:
    name: 太郎

# ○ 良い例(スペースを使用)
person:
  name: 太郎

YAMLではタブは使えません。必ずスペースを使いましょう。

間違い2:コロンの後のスペース忘れ

# ✕ ダメな例
name:太郎

# ○ 良い例
name: 太郎

コロンの後には、必ずスペースが必要です。

間違い3:インデント幅の不統一

# ✕ ダメな例(インデントがバラバラ)
person:
  name: 太郎
   age: 30
    city: 東京

# ○ 良い例(統一されている)
person:
  name: 太郎
  age: 30
  city: 東京

インデント幅は統一しましょう(通常2スペースまたは4スペース)。

間違い4:意図しない型変換

# ✕ これは数値の1.0になる
version: 1.0

# ○ 文字列にする場合
version: "1.0"

# ✕ これはブール値のtrueになる
answer: yes

# ○ 文字列にする場合
answer: "yes"

実践的な使用例

Docker Compose の例

version: "3.8"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    environment:
      - NGINX_HOST=example.com
      - NGINX_PORT=80
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

GitHub Actions の例

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.9

      - name: Install dependencies
        run: |
          pip install -r requirements.txt

      - name: Run tests
        run: pytest

まとめ:YAMLのデータ型を使いこなそう

YAMLのデータ型について、基礎から応用まで解説してきました。

重要ポイントのおさらい:

  1. 3つの基本型を理解する
    スカラー、シーケンス、マッピングが基本
  2. 文字列は引用符で明示的に
    意図しない型変換を防ぐため、迷ったら引用符で囲む
  3. インデントはスペースのみ
    タブは使えない。幅は統一する
  4. コロンの後にはスペース必須
    key: value の形式を守る
  5. アンカーとエイリアスで重複を削減
    同じ設定を何度も書く必要がなくなる

YAMLは見た目がシンプルですが、データ型の扱いには細かいルールがあります。この記事を参考に、正確で読みやすいYAMLファイルを書いてくださいね!

コメント

タイトルとURLをコピーしました