JSONはシステム開発で多用されています。それだけにJSONを扱いやすくするツールがあれば、それだけで生産性が上がることでしょう。システムから出力したJSONを検索したり、目的通りにデータが入っているか確認する機会は多いはずです。 そんな時に使えるのがgronになります。JSONを検索するのに便利なコマンドです。

gronの使い方

gronでの検索例です。一行ごとに並んでいるので値が分かりやすいです。

$ gron "https://api.github.com/repos/tomnomnom/gron/commits?per_page=1" | fgrep "commit.author"
json[0].commit.author = {};
json[0].commit.author.date = "2020-11-07T01:17:42Z";
json[0].commit.author.email = "mail@tomnomnom.com";
json[0].commit.author.name = "Tom Hudson";

目的の部分だけをJSONに戻すこともできます。

$ gron "https://api.github.com/repos/tomnomnom/gron/commits?per_page=1" | fgrep "commit.author" | gron --ungron
[
  {
    "commit": {
      "author": {
        "date": "2020-11-07T01:17:42Z",
        "email": "mail@tomnomnom.com",
        "name": "Tom Hudson"
      }
    }
  }
]

処理している内容です。gronではJSONをJavaScriptのコードにしています。

$ gron $data.json 
json = {};
json.$id = "https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/$data.json#";
json.$schema = "http://json-schema.org/draft-06/schema#";
json.additionalProperties = false;
json.description = "Meta-schema for $data reference (JSON-schema extension proposal)";
json.properties = {};
json.properties.$data = {};
json.properties.$data.anyOf = [];
json.properties.$data.anyOf[0] = {};
json.properties.$data.anyOf[0].format = "relative-json-pointer";
json.properties.$data.anyOf[1] = {};
json.properties.$data.anyOf[1].format = "json-pointer";
json.properties.$data.type = "string";
json.required = [];
json.required[0] = "$data";
json.type = "object";

gronではJSONを再現するJavaScriptコードが出力されます。整形とはまた違う形で出力されるので、プログラマーにとっては読みやすいかも知れません。配列になっているのか、オブジェクトなのかも一目で分かります。ぜひAPIを伴う開発で使ってみてください。

gronはGo製のオープンソース・ソフトウェア(MIT License)です。

tomnomnom/gron: Make JSON greppable!