LoginSignup
8
4

More than 1 year has passed since last update.

JMESPathについて

Last updated at Posted at 2022-04-28

JMESPathはJSONのquery language。

作成者はJames Saryerwinnieさんで、jmespathの呼び方は下記の通り"James Path"らしい。

JSONのクエリ言語ではありますが、この構文が。

aws-cliの出力を整形してくれる--queryオプションがJMESPathだったり。
Azure CLIの出力を整形してくれる--queryオプションがJMESPathだったり。
ansibleのフィルタjson_queryがJMESPathだったり。

などで採用されており、ここらへんをさわったことがあれば実はJMESPathを利用しているなんて事もあるかと思います。

AWS CLI 出力をフィルタリングする
JMESPath クエリを使用して Azure CLI コマンドの出力に対してクエリを実行する方法
Selecting JSON data: JSON queries

各種ツールで出力を整形してくれるので、ある程度使えると便利な構文かと思います。

余談

aws-cliでJMESPathが使えるようになったのはv1.2.0かららしい。

aws-cli/CHANGELOG.rst

ドキュメントとか各種サイト

JMESPath
github jmespath
James Saryerwinnie

JMESPathについて

JMESPath Tutorial
JMESPath Examples

公式サイトのチュートリアスとサンプルが充実しているので、基本的にはこちらをさわって見るのが早いと思います。

ブラウザ上で実際にJMESPathを入力して結果がどうなるか確認しながら学ぶことができます。

だいたい感覚をつかみつつ、仕様を読みつつ。

JMESPath Specification

各種ライブラリ

JMESPath Libraries

JMESPathでは各種言語で利用できるライブラリだったり、コマンド(jp)だったりターミナル(jpterm)が用意されています。

あと公式のライブラリページには記載されていませんが。

VSCode向けの拡張機能もあったりします。

JMESPath for Visual Studio Code
jmespath

Windowsに jp コマンドをインストールしてPowerShellから実行してみる

jmespath/jp - install

インストールのところを参照すると、リリースページにWindows, Linux, Mac, FreeBSD用のバイナリがあるとのことなので、今回はこちらからダウンロードしてpathを通しておきます。

# jp-windows-amd64をダウンロードして~/bin/jp/jp.exe というパスに保存
Invoke-WebRequest -uri https://github.com/jmespath/jp/releases/latest/download/jp-windows-amd64 -OutFile (New-Item ~/bin/jp/jp.exe -Force)
# 一時的にPATHに追加(永続的に追加する場合は別途環境変数PATHに追加して下さい)
$env:path+=";$env:USERPROFILE\bin\jp\"

jp --version

image.png

jpコマンドでパースしてみる

今回は 下記のようなJsonをjpコマンドで整形してみます。

{
  "locations": [
    {"name": "Seattle", "state": "WA"},
    {"name": "New York", "state": "NY"},
    {"name": "Bellevue", "state": "WA"},
    {"name": "Olympia", "state": "WA"}
  ]
}'
$sampleJson='{
  "locations": [
    {"name": "Seattle", "state": "WA"},
    {"name": "New York", "state": "NY"},
    {"name": "Bellevue", "state": "WA"},
    {"name": "Olympia", "state": "WA"}
  ]
}'
# stateがWAの物を抽出して項目nameを出力
$sampleJson | jp "locations[?state=='WA'].name"

# stateがWAの物を抽出して'hello'という文字列と項目nameを出力
$sampleJson | jp "locations[?state=='WA'].['hello',name]"

# stateがWAの物を抽出 joinで 'hello'という文字列と項目nameをスペース(' ')でjoin
$sampleJson | jp "locations[?state=='WA'].join(' ',['hello',name])"

image.png

総評

個人的にはaws-cliで出力を整形する際は、--queryオプション(JMESPath)でほぼほぼ整形してしまいます。

やりすぎるとJMESPath芸みたいな色が出てはしまいますが……

aws-cliコマンド一発で出力の整形までやってしまえるとそれはそれで便利です。

8
4
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
8
4