この記事は、🎅GMOペパボエンジニア Advent Calendar 2022の2日目のものです。

みなさんは、JSON processorを使っていますか?ええ、jqのようなツールのことです。世は大JSON時代、値を抽出したり、変換したりする機会も多いことでしょう。

ところで、jqの抽出クエリやコマンドラインオプション、さらっと書けますか?私はあんまり得意じゃないです。そこで、JavaScriptで書けるJSON processor「jpro をつくりました。

使ってみる

実際に使ってみましょう。Node.jsとnpmが使える環境ならば、事前のインストールなしに、「npx jpro」で実行できます1。以下では、私が最近書いた記事のタイトル5つを、JSON Feedから抽出しています。

jproを使って、著者の、最近の記事5つを抽出する

抽出クエリはJavaScriptで書く

記事タイトルの「JavaSciriptで書く」とは、JSONの抽出・変換クエリをJavaScriptで書けることを指しています。jproの引数に指定する抽出クエリは、次のようなJavaScriptコード片です。

.items.slice(0,5).map(p=>p.title)

与えたコード片は、暗黙に、「output = input」に続くものとして解釈されます。 つまり、次のようなコードとして実行されます。

output = input.items.slice(0,5).map(p=>p.title)

ここで出てくる変数inputは、標準入力のJSONをパースしたJavaScript Objectです。変数outputは、標準出力されるJSONのもとになるJavaScript Objectです。 slicemapはそれぞれ配列のメソッド、p=>p.titleアロー関数です。

JavaScriptの文法をそのまま使って「標準入力のうち、itemsキーの値である配列のうち、はじめから5つを取り出し、さらに、titleというキーのみを抽出する」ということが書けます。

JSON以外の入出力もできる

さらに、先ほどのコード片には出てこなかったstdinstdoutという変数を用いると、JSON以外の入出力も行えます。たとえば以下の例では、JSONではなく、行ごとの文字列を出力しています。

$ curl -s https://rsss.yammer.jp/v0/json_feed \
  | npx jpro ';stdout=input.items.slice(0,5).map(p=>p.title).join("\n")'
Asahi Linuxを使う
Fitbit Charge 5を買った
Python実践機械学習システム100本ノックの準備
印象に残った仕事の話をきく話
HerokuからCloud Run + Litestreamへ移行した

jproのクエリで使える、用意された変数は以下のとおりです。

変数 役割
input 標準入力のJSONをパースしたJavaScript Object
output 標準出力のJSONに変換されるJavaScript Object
stdin JSONとしてパースする前の標準入力
stdout 標準出力される文字列 (nullundefined以外の値が代入されれば、outputの代わりに、stdoutの値が標準出力される)

おわりに

jqはJSONの抽出を主目的にした記法を持ち、jproよりも短いクエリで記述できる場合が多いでしょう。一方、jproはJavaScriptコードをevalするというシンプルなつくり2であり、JavaScriptの文法がそのまま使えます。ちょっと凝ったことをするときも、JavaScriptを知っていれば、比較的簡単に書けることと思います。

コマンドラインでJSONを抽出するとき、記法に悩む必要はありません。やりたいことがすぐにできることは、素早さに繋がり、価値になります。jproが、JSON抽出のひとつの選択肢になれば幸いです。

🎅 / 🎄 GMOペパボエンジニア Advent Calendar 2022

この記事は、🎅GMOペパボエンジニア Advent Calendar 2022の2日目のものでした。今年のペパボエンジニアには🎅(サンタ会場)のほかにも、🎄(ツリー会場)があります。

昨日は、よしこさんの未経験転職したい人へのエッセイ、あつい記事でした。

エンジニアの未経験転職を希望する方へ未経験転職した経験から伝えたいこと|yoshikouki|note

明日は、inowayさんの記事です!

【入社エントリー】ペパボカレッジを全力でおすすめしてみる - 脈絡はありません

追記: プログラミングが楽しくなった、アウトプット量が増えた、というところが印象的でした!

iframeでカレンダーを埋め込めるようなので追加してみました

Footnotes

  1. npm install -g jpro」を実行し、システムにインストールすることもできます。このほうが、コマンドの起動が速いようです。

  2. jproの実装はいたって単純です。コードはいかなるnpm packageにも依存しておらず、たったの62行、しかもその2/3はヘルプメッセージです。やっていることは主に、先ほど示した4つの変数の準備と、クエリのeval、出力だけです。実装よりも、この記事の執筆の方が時間がかかっています。