cURL
で実行結果のレスポンスJSONを整形するためのライブラリのjq
は色んな所で使われていると思います。
そのJSONを扱うためのjq
のラッパーライブラリとして、YAMLを扱うことができるyq
があります。
実際に困ったことは無いのですが、「ローカルはYAMLでずっと管理していたのに、AWSのAPI GatewayのSwaggerインポートを使おうと思ったらJSONファイルしか適応できなかった!書き直しめんどくさい!」とかが今後起きそうなので、yq
の使い方を覚えることにします。
※AWSのAPI GatewayはJSONもYAMLも対応しています。あくまでイメージしてもらうための例です。
インストール
pip3が入っている環境で、以下のコマンドを打つとダウンロードできます。
今回、私はGitpod上で検証させていただきました。もし、使い心地をとりあえず試したい方はGitpod上で確認してもいいと思います。
なお、GitHub CodespacesはインストールNGでした。
pip3 install yq
Mac OSはHomebrewからインストールできるようです。
brew install python-yq
操作したファイル
ファイル:.gitpod.yml
image: file: .gitpod.Dockerfile tasks: - init: 'echo "TODO: Replace with init/build command"' command: 'echo "TODO: Replace with command to start project"'
YAMLをJSONに変換する
全設定をJSONにする
全設定をJSONにする場合は、.
で設定すると抜き出せました。
yq . .gitpod.yml
{ "image": { "file": ".gitpod.Dockerfile" }, "tasks": [ { "init": "echo \"TODO: Replace with init/build command\"", "command": "echo \"TODO: Replace with command to start project\"" } ] }
一部項目だけをJSONにする
YAMLのtasks
配下の構造だけ抜き出したい時は以下のコマンドです。
yq .tasks .gitpod.yml
[ { "init": "echo \"TODO: Replace with init/build command\"", "command": "echo \"TODO: Replace with command to start project\"" } ]
JSONファイルにする(リダイレクトするだけ)
リダイレクトでファイルを作成できるので、ライブラリ側では特に機能がありません。私が変換する際に混乱したので、残しておきます。
yq .tasks .gitpod.yml > .gitpod.json
JSONをYAMLに変換する
-y
オプションを付けると、逆にJSONからYAMLを変換できます。
yq -y . .gitpod.json
image: file: .gitpod.Dockerfile tasks: - init: 'echo "TODO: Replace with init/build command"' command: 'echo "TODO: Replace with command to start project"'
その他のオプションについて
GitHubに格納されているソースを確認してください。私は使い道が分からなかったので、多分そんなに使わないと考えてます。
終わりに
yq
自体はJSONとYAMLの変換がメインの機能のようなので、jq
の機能をすべてYAML用に書き換えているわけではないようです。
ただ、jq
自体が多機能なので、YAMLをマージする等々を行いたい時は一回jq
を経由するといろいろできそうです。
完全に想定通りの挙動ではありませんが、以下のやり方でYAMLのマージができました。
yq
でYAMLをJSONに変換jq
でマージyq
でYAMLに変換
私はjq
のことは何も分からないので、どこかで勉強しようと思います。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
参考記事
Developers.IO:jqのYAML/XMLラッパー yq でJSONとYAMLを自在に操る dev.classmethod.jp
Developers.IO:複数のjsonファイルをjqを使ってmergeする dev.classmethod.jp
yqのGitHubソース github.com