ブロックを積みながら(98) Node-REDでJSONataの練習その3

Joseph Halfmoon

「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 のドキュメントは以下です。

JSONata Documentation

今回実験のフローとテストデータ

実験フローは冒頭のアイキャッチ画像に掲げました。例によってInjectノードでテストデータを送り、changeノードでJSONata式で処理してデバッグウインドウに送るもの。

テストデータは以下です。datarecordsとプロパティ名のついたarrayが一つ。アレイの中にはオブジェクトが4要素ほど並んでいます。各要素オブジェクトにはさらに要素2つが含まれております。name と itemとな。JSONtestData

上記の name プロパティには、同じ abc なるものが複数あります。面倒くさかったのか、自分?

配列から数値データのみ抽出

まずはテストデータのdatarecords配列全体から、itemプロパティの値部分のみを全抽出してみたいと思います。changeノードで実行するJSONata式は以下のとおりです。

getAllItemsSetting

配列の特定要素を取り出したいときは[0]などと要素番号で指定することもできますが、全要素を対象にするときは[]のままでいいみたい。知らんけど。

さて抽出の結果が以下に。4要素の配列にテストデータの順番通りに値だけがのってきています。getAllItemsResults

配列の中でも条件にあった項目だけを抽出

テストデータのdatarecords配列全体から、nameプロパティが特定の値 abc のものだけを抽出してみたいと思います。「さいわい」同じ値 abc の要素は3個あります。changeノードで実行するJSONata式は以下のとおりです。

getABCrecords

今回は3要素の配列が返ってきました。datarecordsの抽出なので配列要素はオブジェクトになってます。getABCrecordsResults

配列の中で条件にあった項目の値を抽出してソート

テストデータのdatarecords配列全体から、nameプロパティが特定の値 abc のものを抽出した上で、itemの値をとりだしてソートしてみます。だんだん複雑になってきましたが、JSONata式はへいちゃらです。

sortABCrecords

以下では、ソートされているのがわかりますかね。1か所順番がひっくり返っただけだけれども。sortABCrecordsResults

配列の中で条件にあった項目の値を抽出して総和、結果をオブジェクト化

上記ではソートできたので、ソートの関数$sortを総和を求める関数 $sum に変更すれば総和は求まります。それだけでは面白くないので、結果の数値をプロパティSUMの値とするオブジェクトにしてpayloadに載せてみました。こんな感じ。sumABCrecords

 

上の式の黄色のマーカー部分がミソですな。

sumABCrecordsResultsOBJ

JSONからの抽出ができるだけでなく、当然抽出した結果を加工した結果を新たなJSONオブジェクトにすることも可能と。あたりまえか。

ブロックを積みながら(97) Node-REDでJSONataの練習その2 へ戻る

ブロックを積みながら(99) Node-RedでSQLiteの練習その1 へ進む