TOML配列の書き方完全ガイド!初心者でも分かる基本から応用まで

プログラミング・IT

プログラミングで設定ファイルを扱う時、「TOML」という形式を見たことはありませんか?

TOMLは設定ファイル用の言語で、読みやすくて書きやすいのが特徴です。中でも「配列」の書き方は、データをまとめて管理する時に欠かせません。

この記事では、TOML形式での配列の書き方を初心者向けに分かりやすく解説します。基本的な書き方から、実際のプロジェクトで使える応用テクニックまで詳しく説明するので、ぜひ参考にしてください。

スポンサーリンク

TOMLとは?

TOMLは「Tom’s Obvious, Minimal Language(トムの分かりやすくて最小限の言語)」の略称です。

設定ファイルを記述するためのフォーマットで、2013年にGitHubの共同創業者であるTom Preston-Werner氏によって開発されました。現在はバージョン1.0が正式にリリースされています。

TOMLの特徴:

  • 人間が読みやすい明確な構文
  • データ型が明確で曖昧さがない
  • Pythonの辞書に似た構造
  • プログラミング言語から簡単に扱える

Rust、Python、Go、JavaScriptなど多くのプログラミング言語で使われています。

配列の基本的な書き方

TOMLでの配列は、角括弧([ ])を使って表現します。

シンプルな配列

最も基本的な配列の書き方です。

fruits = ["apple", "banana", "orange"]

カンマ(,)で要素を区切り、文字列はダブルクォート(”)で囲みます。

数値の配列:

numbers = [1, 2, 3, 4, 5]

数値の場合はクォートで囲む必要はありません。

真偽値の配列:

flags = [true, false, true]

trueとfalseも直接書けます。

複数行に分けて書く

配列が長い場合、読みやすくするために複数行に分けることができます。

colors = [
    "red",
    "green",
    "blue",
    "yellow"
]

最後の要素の後にカンマを付けても問題ありません。

colors = [
    "red",
    "green",
    "blue",
    "yellow",
]

この書き方を「トレーリングカンマ」と呼びます。要素の追加や削除がしやすくなるので便利です。

配列の要素は同じ型にする

TOMLの配列では、すべての要素が同じデータ型である必要があります。

正しい例:

# すべて文字列
names = ["Alice", "Bob", "Charlie"]

# すべて数値
scores = [85, 92, 78]

間違った例:

# 文字列と数値が混在している(エラー)
mixed = ["apple", 123, "banana"]

異なる型を混ぜるとエラーになるので注意しましょう。

配列のネスト(入れ子)

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

2次元配列

行列のようなデータ構造を作れます。

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

この例では、3×3の数値の配列を表現しています。

注意点:

内側の配列も同じ型の要素で構成する必要があります。

より複雑なネスト

配列のネストは何段階でも可能です。

data = [
    ["a", "b"],
    ["c", "d", "e"],
    ["f"]
]

ただし、あまり複雑にしすぎると読みにくくなるので、適度に使いましょう。

テーブルの配列

TOMLでは、設定のグループを「テーブル」と呼びます。テーブルの配列を使うと、同じ構造のデータを複数定義できます。

基本的なテーブルの配列

二重の角括弧([[ ]])を使って表現します。

[[products]]
name = "Apple"
price = 100
stock = 50

[[products]]
name = "Banana"
price = 80
stock = 30

[[products]]
name = "Orange"
price = 120
stock = 40

この例では、productsという配列に3つの商品データが入っています。

重要なポイント:

  • [[ ]]は配列の要素を追加することを意味します
  • 各[[products]]が一つの要素になります
  • 要素ごとに複数のキーと値を持てます

テーブル配列の構造

上記の例をプログラミング言語で表すと、次のようになります。

Python風に書くと:

products = [
    {"name": "Apple", "price": 100, "stock": 50},
    {"name": "Banana", "price": 80, "stock": 30},
    {"name": "Orange", "price": 120, "stock": 40}
]

JSON風に書くと:

{
    "products": [
        {"name": "Apple", "price": 100, "stock": 50},
        {"name": "Banana", "price": 80, "stock": 30},
        {"name": "Orange", "price": 120, "stock": 40}
    ]
}

TOMLの方が読みやすいことが分かりますね。

ネストしたテーブル配列

テーブルの中にさらに配列を持たせることもできます。

[[users]]
name = "Alice"
email = "alice@example.com"
roles = ["admin", "developer"]

[[users]]
name = "Bob"
email = "bob@example.com"
roles = ["user"]

この例では、各ユーザーがrolesという配列を持っています。

インラインテーブルと配列

インラインテーブルは、一行で書けるテーブルです。

インラインテーブルの配列

points = [
    { x = 1, y = 2 },
    { x = 3, y = 4 },
    { x = 5, y = 6 }
]

座標のような単純な構造を表現する時に便利です。

注意点:

インラインテーブルは改行できません。複雑なデータには向いていないので、シンプルな場合のみ使いましょう。

インラインテーブルの制約

# 正しい書き方
person = { name = "Alice", age = 30 }

# 間違った書き方(改行できない)
person = { 
    name = "Alice",
    age = 30
}

改行したい場合は、通常のテーブル形式を使ってください。

実際の使用例

実際のプロジェクトでよく見る配列の使い方を紹介します。

依存関係の管理(Rustのプロジェクト例)

Rustの設定ファイル「Cargo.toml」では、依存するライブラリを配列で管理します。

[package]
name = "my-project"
version = "0.1.0"

serde = “1.0” tokio = { version = “1.0”, features = [“full”] } [[bin]] name = “app1” path = “src/main.rs” [[bin]] name = “app2” path = “src/bin/app2.rs”

binはテーブルの配列で、複数の実行ファイルを定義しています。

データベース設定の例

複数のデータベース接続を設定する場合です。

[[database]]
name = "main"
host = "localhost"
port = 5432
username = "admin"

[[database]]
name = "backup"
host = "backup.example.com"
port = 5432
username = "readonly"

この構造なら、データベースの追加や削除が簡単にできます。

サーバー設定の例

複数のサーバーエンドポイントを管理する場合です。

[server]
host = "0.0.0.0"
port = 8080
allowed_origins = [
    "http://localhost:3000",
    "https://example.com"
]

[[server.routes]]
path = "/api/users"
methods = ["GET", "POST"]

[[server.routes]]
path = "/api/products"
methods = ["GET", "POST", "PUT", "DELETE"]

ルート設定を配列で管理しています。

よくあるエラーと解決方法

TOML配列でよく起きるエラーとその対処法です。

エラー1:異なる型の混在

# エラー:文字列と数値が混在
items = ["apple", 123, "banana"]

解決方法:

すべて同じ型にします。

# 正しい例
items = ["apple", "123", "banana"]

または数値だけにします。

numbers = [100, 123, 200]

エラー2:クォートの付け忘れ

# エラー:文字列にクォートがない
colors = [red, green, blue]

解決方法:

文字列は必ずダブルクォートで囲みます。

# 正しい例
colors = ["red", "green", "blue"]

エラー3:カンマの付け忘れ

# エラー:カンマがない
fruits = [
    "apple"
    "banana"
]

解決方法:

要素の間にカンマを入れます。

# 正しい例
fruits = [
    "apple",
    "banana"
]

エラー4:インラインテーブルの改行

# エラー:インラインテーブルで改行している
point = { 
    x = 1,
    y = 2
}

解決方法:

一行で書くか、通常のテーブル形式にします。

# 正しい例1:一行で書く
point = { x = 1, y = 2 }

# 正しい例2:通常のテーブルにする

x = 1 y = 2

配列を扱う際のベストプラクティス

より良いTOMLファイルを書くためのコツです。

1. 適切な改行を使う

要素が多い場合は、複数行に分けましょう。

# 読みにくい例
tags = ["web", "api", "database", "security", "performance", "testing"]

# 読みやすい例
tags = [
    "web",
    "api",
    "database",
    "security",
    "performance",
    "testing"
]

2. トレーリングカンマを活用

最後の要素にもカンマを付けると、要素の追加が楽になります。

languages = [
    "Python",
    "Rust",
    "Go",
]

後で新しい言語を追加する時、最後の行だけ変更すれば済みます。

3. コメントで説明を加える

複雑な設定には、コメントで説明を付けましょう。

# 許可するオリジンのリスト
allowed_origins = [
    "http://localhost:3000",  # 開発環境
    "https://example.com",     # 本番環境
]

コメントは「#」で始めます。

4. 論理的なグループ化

関連する設定はまとめて配置しましょう。

# サーバー設定

host = “0.0.0.0” port = 8080 # ログ設定

level = “info” formats = [“json”, “text”] # データベース設定 [[database]] name = “primary” host = “localhost”

セクションごとに空行を入れると読みやすくなります。

5. 命名規則を統一

キー名の命名規則を統一しましょう。

# 推奨:スネークケース
database_name = "mydb"
max_connections = 100

# または ケバブケース
database-name = "mydb"
max-connections = 100

プロジェクト内で一貫性を保つことが大切です。

TOMLと他の形式の比較

TOMLと似た設定ファイル形式との違いを見てみましょう。

TOMLとJSON

JSON:

{
    "users": [
        {
            "name": "Alice",
            "roles": ["admin", "developer"]
        },
        {
            "name": "Bob",
            "roles": ["user"]
        }
    ]
}

TOML:

[[users]]
name = "Alice"
roles = ["admin", "developer"]

[[users]]
name = "Bob"
roles = ["user"]

TOMLの方が人間にとって読みやすいですね。

TOMLとYAML

YAML:

users:
  - name: Alice
    roles:
      - admin
      - developer
  - name: Bob
    roles:
      - user

TOML:

[[users]]
name = "Alice"
roles = ["admin", "developer"]

[[users]]
name = "Bob"
roles = ["user"]

YAMLはインデントで構造を表現しますが、TOMLは明示的な記号を使います。

プログラミング言語での読み込み

各言語でTOML配列を読み込む方法を簡単に紹介します。

Python

import tomli  # Python 3.11以降は標準ライブラリ

with open("config.toml", "rb") as f:
    config = tomli.load(f)

# 配列にアクセス
fruits = config["fruits"]
print(fruits)  # ['apple', 'banana', 'orange']

# テーブル配列にアクセス
for user in config["users"]:
    print(user["name"])

Rust

use serde::Deserialize;

#[derive(Deserialize)]
struct Config {
    fruits: Vec<String>,
    users: Vec<User>,
}

#[derive(Deserialize)]
struct User {
    name: String,
    roles: Vec<String>,
}

let config_str = std::fs::read_to_string("config.toml")?;
let config: Config = toml::from_str(&config_str)?;

JavaScript/Node.js

const toml = require('toml');
const fs = require('fs');

const config = toml.parse(fs.readFileSync('config.toml', 'utf-8'));

// 配列にアクセス
console.log(config.fruits);  // ['apple', 'banana', 'orange']

// テーブル配列にアクセス
config.users.forEach(user => {
    console.log(user.name);
});

よくある質問

TOML配列に関する疑問にお答えします。

空の配列は書ける?

はい、書けます。

empty = []

空の配列は有効なTOML構文です。

配列の要素数に制限はある?

TOML仕様上は制限はありませんが、パーサー(解析ライブラリ)によって実装上の制限がある場合があります。通常の使用では問題ありません。

配列のインデックスは指定できる?

いいえ、TOMLでは配列の要素は順番に並べるだけです。特定のインデックスを指定する構文はありません。

日付や時刻も配列にできる?

はい、できます。

dates = [
    2024-01-01,
    2024-06-15,
    2024-12-31
]

TOMLは日付型をサポートしています。

コメントは配列の中に書ける?

はい、書けます。

items = [
    "item1",  # 最初のアイテム
    "item2",  # 二番目のアイテム
    # "item3",  # コメントアウトされた要素
    "item4"
]

まとめ

TOML配列は、設定ファイルでデータをまとめて管理するための便利な機能です。

この記事のポイント:

  • 配列は角括弧[ ]で表現する
  • すべての要素は同じ型である必要がある
  • 複数行に分けて読みやすく書ける
  • テーブルの配列は[[ ]]で表現する
  • インラインテーブルはシンプルな構造に適している
  • 異なる型の混在や改行のルールに注意が必要
  • トレーリングカンマやコメントを活用すると読みやすくなる

TOMLは設定ファイル用の言語として非常に優れています。

JSONよりも人間に優しく、YAMLよりも明確な構文を持っているので、プロジェクトの設定管理に最適です。配列の書き方をマスターすれば、複雑な設定も整理して管理できるようになりますよ。

ぜひ実際のプロジェクトでTOMLを使ってみてください!

コメント

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