0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【qq】JSON/YAML/TOMLをワンコマンド変換する決定版ツール

0
Last updated at Posted at 2026-02-24

「YAMLをJSONに変換して、jqで加工して、またYAMLに戻す」という作業を毎回やっていませんか?
qqを使えば、15種以上の形式変換とjqクエリがワンコマンドで完結します。この記事では、qqの基本操作から設定ファイルの加工ワンライナーまでを紹介します。

qqの特徴

  • JSON/YAML/TOML/CSV/XMLなど15種以上の形式をワンコマンドで相互変換
  • YAMLやTOMLファイルに対してjqクエリを直接実行
  • 設定ファイルの「変換→加工→上書き」がワンライナーで完結

対応形式一覧

カテゴリ 形式
データ交換 JSON, YAML, TOML, CSV, TSV
設定ファイル INI, HCL, Terraform (.tf)
マークアップ XML, HTML
バイナリ Parquet, MessagePack

インストール

eget(推奨)

「依存ゼロ・1ファイル」の超軽量パッケージマネージャEgetで解説しています。

eget JFryy/qq --to ./bin/qq --asset "^md5"

Homebrew(macOS)

brew install jfryy/tap/qq

基本的な使い方

データ形式を変換する

JSON → YAML

echo '{"name": "myapp", "version": "1.0", "debug": true}' | qq -o yaml
debug: true
name: myapp
version: "1.0"

JSON → TOML

echo '{"name": "myapp", "version": "1.0", "debug": true}' | qq -o toml
debug = true
name = "myapp"
version = "1.0"

ファイルからの変換(拡張子で自動判別)

# YAML → JSON
qq config.yaml -o json

# TOML → YAML
qq settings.toml -o yaml

# CSV → JSON
qq data.csv -o json

YAML/TOMLにjqクエリを実行する

qqはjq互換のクエリをサポートしています。YAML/TOMLファイルに対してもjqクエリを直接実行できます。

サンプル設定ファイル(config.yaml):

server:
  host: localhost
  port: 8080
database:
  host: db.example.com
  port: 5432

特定のキーを抽出:

qq '.server.port' config.yaml
8080

複数の値を取得:

qq '{server_port: .server.port, db_host: .database.host}' config.yaml
{
  "db_host": "db.example.com",
  "server_port": 8080
}

配列操作も可能:

echo '{"items": [1, 2, 3, 4, 5]}' | qq '.items | map(. * 2)'
[
  2,
  4,
  6,
  8,
  10
]

実践:設定ファイルをワンライナーで加工する

YAMLやTOMLファイルの一部の値をスクリプトで書き換えたい場面は多いです。従来は以下の手順が必要でした。

# 従来の方法(3ステップ)
yq -o json config.yaml > /tmp/config.json    # 1. JSON変換
jq '.server.port = 9090' /tmp/config.json > /tmp/config_new.json  # 2. 加工
yq -P /tmp/config_new.json > config.yaml     # 3. YAML変換

qqなら1行で完結する

f="config.yaml"; qq "$f" | jq '.server.port = 9090' | qq -o "${f##*.}" | sponge "$f"

処理の流れ:

  1. qq "$f" - YAMLをJSONに変換(デフォルト出力)
  2. jq '.server.port = 9090' - jqで値を変更
  3. qq -o "${f##*.}" - 元の形式(yaml)に再変換
  4. sponge "$f" - ファイルを上書き(moreutilsのコマンド、同一ファイルへのリダイレクト問題を回避)

JSONファイルも同じ要領で加工する

JSON → JSONの変換では整数が保持されます。

f="config.json"; qq "$f" | jq '.api.timeout = 30' | qq -o json | sponge "$f"

オプション一覧

オプション 説明 使用例
-o 出力形式を指定 qq data.yaml -o json
-i 入力形式を明示(stdinは自動判別できないことがある) cat data | qq -i yaml -o json
-r 文字列をクォートなしで出力 qq -r '.name' data.json
-I インタラクティブモード qq -I data.yaml

制約事項

qqには以下の制約があります。用途によっては注意が必要です。

変換時にキーの順序が変わる

変換時にキーがアルファベット順にソートされます。

echo '{"z": 1, "a": 2, "m": 3}' | qq -o yaml
a: 2.0
m: 3.0
z: 1.0

元の順序(z → a → m)がアルファベット順(a → m → z)に変わります。キーの順序に意味がある設定ファイルでは注意が必要です。

YAML/TOML出力時に整数が浮動小数点になる

YAML/TOML出力時、整数が浮動小数点表記になります。

echo '{"port": 8080}' | qq -o yaml
port: 8080.0

JSON出力では整数が保持されます。多くの場合 8080.0 のままで動作しますが、見た目が気になる場合は後処理が必要です。

まとめ

やりたいこと コマンド
YAML → JSON qq file.yaml -o json
JSON → TOML qq file.json -o toml
YAMLからキー抽出 qq '.key.path' file.yaml
ファイル加工&上書き f="file.yaml"; qq "$f" | jq '...' | qq -o yaml | sponge "$f"

qqを使えば、設定ファイルの形式変換とjqによる加工がシームレスに行えます。キー順序や数値表記の制約はありますが、シェルスクリプトでの設定ファイル操作が格段に楽になるので、ぜひ試してみてください。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?