JSON操作がjqより便利なフィルター機能があるjnvの使い方

jqとは

jnvの前にjqとcurlについて少し説明します。(ご存知の方はここは読み飛ばしてください)

jqはターミナルで使用可能なJSONデータの操作や処理に特化したツールです。

Macの場合はHomebrewを使用すれば簡単にインストールできます。

brew install jq

Download jq

jqでJSONデータを表示するにはcatコマンドを実行してからjqを実行します。

cat data.json | jq

実行すると以下のようにJSONデータが見られます。

cat data.json | jq
{
  "id": 1,
  "title": "iPhone 9",
  "description": "An apple mobile which is nothing like apple",
  "price": 549,
  "discountPercentage": 12.96,
  "rating": 4.69,
  "stock": 94,
  "brand": "Apple",
  "category": "smartphones",
  "thumbnail": "https://cdn.dummyjson.com/product-images/1/thumbnail.jpg",
  "images": [
    "https://cdn.dummyjson.com/product-images/1/1.jpg",
    "https://cdn.dummyjson.com/product-images/1/2.jpg",
    "https://cdn.dummyjson.com/product-images/1/3.jpg",
    "https://cdn.dummyjson.com/product-images/1/4.jpg",
    "https://cdn.dummyjson.com/product-images/1/thumbnail.jpg"
  ]
}

ローカルのJSONファイルではなく、サーバー上のJSONデータを確認したい場合は、curlコマンドを使用して以下のように実行します。

curl -s https://dummyjson.com/products/1 | jq

curlコマンドはオプションを「-o」にして、ファイル名を指定したあとにURLを実行するとJSONファイルをダウンロードできます。

curl -o data.json https://dummyjson.com/products/1

jnvとは

jnvは前述のjqにフィルター機能を付けたツールです。

jqと同じくHomebrewでインストールできます。

brew install ynqa/tap/jnv

JSONデータを確認したい場合はjqのようにcatコマンドを使わず、直接「jnv data.json」で確認できるので便利です。

jnv data.json

jnvコマンドを実行すると、「>>」が表示され、ここに「.images」のようにプロパティを入力するとフィルターをかけることができます。

jnvコマンドもcurlコマンドを併用することで、サーバー上のJSONデータを確認できます。

今回はjnvのフィルターの確認のため、「dummyjson.com/products/1」を「dummyjson.com/products」にします。(30件の商品データのダミーのJSONを取得します)

curl -s https://dummyjson.com/products | jnv

「.products[].title」のように入力してフィルターをかければ、30件の商品データのtitleにフィルターをかけて絞り込めます。

lengthで文字数をカウント

フィルターのあとに「 | length」を追記すれば文字数をカウントできます。

curl -s https://dummyjson.com/products | jnv
❯❯ .products[].title | length
8
8
18
7
10
// 以下略

フィルターのあとに「 | length >= 10」のように比較演算子を追記すれば文字数が10以上かboolean値で判定結果が表示されます。

curl -s https://dummyjson.com/products | jnv
❯❯ .products[].title | length >= 10
false
false
true
false
true
// 以下略

特定の文字列が含まれているか判定

フィルターのあとに「 | contains("iPhone")」を追記するとboolean値で判定結果が表示されます。

curl -s https://dummyjson.com/products | jnv
❯❯ .products[].title | contains("iPhone")
true
true
false
false
false
// 以下略

特定のプロパティで並び替える

JSONデータのpriceなどの特定のプロパティを並び替えて確認したい場合は、sort_by(.price)のようにプロパティを指定します。

さらに「 | reverse」をつけることで並び順が降順(高い順)になります。

curl -s https://dummyjson.com/products | jnv
❯❯ .products | sort_by(.price) | reverse
[
  {
    "id": 6,
    "title": "MacBook Pro",
    "description": "MacBook Pro 2021 with mini-LED display may launch between September, November",
    "price": 1749,
    // 中略
  },
  {
    "id": 8,
    "title": "Microsoft Surface Laptop 4",
    "description": "Style and speed. Stand out on HD video calls backed by Studio Mics. Capture ideas on the vibrant touchscreen.",
    "price": 1499,
    // 中略
  },
// 以下略

まとめ

ここまで見ていただいた通り、jnvはjqよりかなり使い勝手が良いツールとなっています。

length, contains, sort_by以外にフィルターで使えるものは、jq Manualに記載されていますので、こちらをご参照ください。

書き方が少し違うこともありますが、ある程度は互換性があります。

jq Manual

jqを使用されている方は使い勝手が良い、jnvに乗り換えることをオススメします。