JMESPathについて

JMESPathはJSONのquery language。

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

https://twitter.com/jsaryer/status/334089520469377024

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

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

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

[AWS CLI 出力をフィルタリングする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-filter.html)
[JMESPath クエリを使用して Azure CLI コマンドの出力に対してクエリを実行する方法](https://docs.microsoft.com/ja-jp/cli/azure/query-azure-cli)
[Selecting JSON data: JSON queries](https://docs.ansible.com/ansible/latest/collections/community/general/docsite/filter_guide_selecting_json_data.html)

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

### 余談

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

[aws-cli/CHANGELOG.rst](https://github.com/aws/aws-cli/blob/develop/CHANGELOG.rst#120)

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

[JMESPath](https://jmespath.org/)
[github jmespath](https://github.com/jmespath)
[James Saryerwinnie](https://twitter.com/jsaryer)

## JMESPathについて

[JMESPath Tutorial](https://jmespath.org/tutorial.html)
[JMESPath Examples](https://jmespath.org/examples.html)

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

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

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

[JMESPath Specification](https://jmespath.org/specification.html)


## 各種ライブラリ

[JMESPath Libraries](https://jmespath.org/libraries.html)

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

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

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

[JMESPath for Visual Studio Code](https://github.com/jmespath/jmespath.vscode)
[jmespath](https://marketplace.visualstudio.com/items?itemName=jamesls.jmespath-vscode)

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

[jmespath/jp - install](https://github.com/jmespath/jp#installing)

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

```PowerShell
# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/77239bed-3761-2b1b-c2d5-0b877fe09159.png)

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

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

```json
{
  "locations": [
    {"name": "Seattle", "state": "WA"},
    {"name": "New York", "state": "NY"},
    {"name": "Bellevue", "state": "WA"},
    {"name": "Olympia", "state": "WA"}
  ]
}'
```

```PowerShell
$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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1fb96212-2167-e0b7-2c74-8c2337dfe4b5.png)

# 総評

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

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

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