🌙

JSON を見る際の便利コマンド jless の紹介

2022/07/23に公開

JSON を見る際の便利コマンド jless の紹介をします。
一言で紹介すると JSON に特化した less コマンドです。

公式サイトのリンクはこちらになります。

シンタックスハイライト

less and jless

こちらが OpenAPI スキーマの example としてよく使われる JSONless (左) と jless (右) にパイプで渡した際の画像です。

右はシンタックスハイライトされており視認性が高いです。

JSON の構造を意識したカーソル移動

  "info": {
    "version": "1.0.0",
    "title": "Swagger Petstore",
    "license": {
      "name": "MIT"    <-- ①
    }    <-- ②
  },
  "servers": [    <-- ③
    {
      "url": "http://petstore.swagger.io/v1"
    }
  ],

① の行にカーソルがあたっている状態で キーをタイプすると、一般的なテキストエディタなどでは ② の位置にカーソルが移動します。
この操作をした場合 jless では ③ の位置にカーソルが移動します。

② の位置に移動したい理由はほとんどないので、 jless の方が簡潔に操作できると言えます。

, のキーの代わりに j, k を使うこともできます。

畳み込み

ある要素を探しているときに、他の興味のない要素がノイズにならないように隠したいシーンがあると思います。

例えば VSCode では行番号のあたりに が表示されるので、これをクリックして畳み込みをしたり展開したりできます。

jless の場合は or h キーで畳み込み、 or l キーで展開できます。
タイプしやすいキーに頻繁に使う操作が割り当てられているのは便利です。

検索

less と同様に / キーで検索を行えます。

要素のコピペ

以下のような JSON を jless で開いており ① の部分にカーソルがあたっているとします。

  "components": {
    "schemas": {
      "Pet": {    <-- ①
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "properties": {
          "id": {
            "type": "integer",
            "format": "int64"
          },
          "name": {
            "type": "string"
          },
          "tag": {
            "type": "string"
          }
        }
      },

このとき JSON のキーや値をクリップボードにコピーする便利なキーバインドがあります。

yy とタイプするとインデントされた JSON がコピーされます。

例:

{
  "type": "object",
  "required": [
    "id",
    "name"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "format": "int64"
    },
    "name": {
      "type": "string"
    },
    "tag": {
      "type": "string"
    }
  }
}

yv とタイプするとインデントなしの JSON がコピーされます。

例:

{ "type": "object", "required": ["id", "name"], "properties": { "id": { "type": "integer", "format": "int64" }, "name": { "type": "string" }, "tag": { "type": "string" } } }

yk とタイプすると JSON のキーがコピーされます。

例:

Pet

yp とタイプするとその要素へのパスがコピーされます。これは一般的なプログラミング言語でのフィールドへのアクセスで使えるような記法です。

.components.schemas.Pet

yb とタイプするとその要素へのパスがコピーされます。これは一般的なプログラミング言語でのマップ、ハッシュ、連想配列、オブジェクトなどへのアクセスで使えるような記法です。

["components"]["schemas"]["Pet"]

yq とタイプするとその要素へのパスがコピーされます。これは jq で使える記法です。

.components.schemas.Pet

この例では ypyq の結果が全く同じですが、配列内にある要素をフォーカスした状態でタイプした際の挙動が異なります。
yp の場合は .[1] など添字が明示されますが、 yq の場合は .[] となって全要素の取得を意味するフォーマットになります。

YAML 対応

パイプからデータを流す場合は --yaml オプションを使って YAML も同様に処理できます。

パイプではなく jless のコマンドライン引数でファイル名を指定するときは拡張子から JSON or YAML が推測されます。

Discussion