「JSONを制するものはNode-REDを制する」(誰が言ったんだ、そんなこと)ということでJSONオブジェクトを思うがままに操作するためのJSONataの練習の3回目です。今回はJSONの中から構造をもったデータを抽出して加工してみるの回。ぶっちゃけ大したことはしてないんだけれども。
※「ブロックを積みながら」投稿順 index はこちら
※動作確認にはRaspberry Pi 3 model B+のRaspberry Pi OS(32bit)上にインストールした以下を使用しています。
-
- Node-RED v2.0.5
- node-red-dashboard 3.2.0
JSONataは、XMLにおけるXPathみたいなものであります。参照させていただいとります JSONata のドキュメントは以下です。
今回実験のフローとテストデータ
実験フローは冒頭のアイキャッチ画像に掲げました。例によってInjectノードでテストデータを送り、changeノードでJSONata式で処理してデバッグウインドウに送るもの。
テストデータは以下です。datarecordsとプロパティ名のついたarrayが一つ。アレイの中にはオブジェクトが4要素ほど並んでいます。各要素オブジェクトにはさらに要素2つが含まれております。name と itemとな。
上記の name プロパティには、同じ abc なるものが複数あります。面倒くさかったのか、自分?
配列から数値データのみ抽出
まずはテストデータのdatarecords配列全体から、itemプロパティの値部分のみを全抽出してみたいと思います。changeノードで実行するJSONata式は以下のとおりです。
配列の特定要素を取り出したいときは[0]などと要素番号で指定することもできますが、全要素を対象にするときは[]のままでいいみたい。知らんけど。
さて抽出の結果が以下に。4要素の配列にテストデータの順番通りに値だけがのってきています。
配列の中でも条件にあった項目だけを抽出
テストデータのdatarecords配列全体から、nameプロパティが特定の値 abc のものだけを抽出してみたいと思います。「さいわい」同じ値 abc の要素は3個あります。changeノードで実行するJSONata式は以下のとおりです。
今回は3要素の配列が返ってきました。datarecordsの抽出なので配列要素はオブジェクトになってます。
配列の中で条件にあった項目の値を抽出してソート
テストデータのdatarecords配列全体から、nameプロパティが特定の値 abc のものを抽出した上で、itemの値をとりだしてソートしてみます。だんだん複雑になってきましたが、JSONata式はへいちゃらです。
以下では、ソートされているのがわかりますかね。1か所順番がひっくり返っただけだけれども。
配列の中で条件にあった項目の値を抽出して総和、結果をオブジェクト化
上記ではソートできたので、ソートの関数$sortを総和を求める関数 $sum に変更すれば総和は求まります。それだけでは面白くないので、結果の数値をプロパティSUMの値とするオブジェクトにしてpayloadに載せてみました。こんな感じ。
上の式の黄色のマーカー部分がミソですな。
JSONからの抽出ができるだけでなく、当然抽出した結果を加工した結果を新たなJSONオブジェクトにすることも可能と。あたりまえか。