この記事は、🎅GMOペパボエンジニア Advent Calendar 2022の2日目のものです。
みなさんは、JSON processorを使っていますか?ええ、jq
のようなツールのことです。世は大JSON時代、値を抽出したり、変換したりする機会も多いことでしょう。
ところで、jq
の抽出クエリやコマンドラインオプション、さらっと書けますか?私はあんまり得意じゃないです。そこで、JavaScriptで書けるJSON processor「jpro
」 をつくりました。
使ってみる
実際に使ってみましょう。Node.jsとnpmが使える環境ならば、事前のインストールなしに、「npx jpro
」で実行できます1。以下では、私が最近書いた記事のタイトル5つを、JSON Feedから抽出しています。
抽出クエリは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です。
slice
とmap
はそれぞれ配列のメソッド、p=>p.title
はアロー関数です。
JavaScriptの文法をそのまま使って「標準入力のうち、itemsキーの値である配列のうち、はじめから5つを取り出し、さらに、titleというキーのみを抽出する」ということが書けます。
JSON以外の入出力もできる
さらに、先ほどのコード片には出てこなかったstdin
やstdout
という変数を用いると、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 |
標準出力される文字列 (null とundefined 以外の値が代入されれば、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さんの記事です!
【入社エントリー】ペパボカレッジを全力でおすすめしてみる - 脈絡はありません
追記: プログラミングが楽しくなった、アウトプット量が増えた、というところが印象的でした!
Footnotes
-
「
npm install -g jpro
」を実行し、システムにインストールすることもできます。このほうが、コマンドの起動が速いようです。 ↩ -
jpro
の実装はいたって単純です。コードはいかなるnpm packageにも依存しておらず、たったの62行、しかもその2/3はヘルプメッセージです。やっていることは主に、先ほど示した4つの変数の準備と、クエリのeval、出力だけです。実装よりも、この記事の執筆の方が時間がかかっています。 ↩