きり丸の技術日記

技術検証したり、資格等をここに残していきます。

yqを使用してYAMLとJSONを相互変換する

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のマージができました。

  1. yqでYAMLをJSONに変換
  2. jqでマージ
  3. 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

f:id:nainaistar:20201010234103j:plain