「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のデータ型について、基礎から応用まで解説してきました。
重要ポイントのおさらい:
- 3つの基本型を理解する
スカラー、シーケンス、マッピングが基本 - 文字列は引用符で明示的に
意図しない型変換を防ぐため、迷ったら引用符で囲む - インデントはスペースのみ
タブは使えない。幅は統一する - コロンの後にはスペース必須
key: value
の形式を守る - アンカーとエイリアスで重複を削減
同じ設定を何度も書く必要がなくなる
YAMLは見た目がシンプルですが、データ型の扱いには細かいルールがあります。この記事を参考に、正確で読みやすいYAMLファイルを書いてくださいね!
コメント