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

Joseph Halfmoon

JSONからのデータ抽出や変形に威力を発揮するJSONataの練習に戻ります。今回はJSONataの関数のうち数値データを処理するものを実験するつもりです。まずは一番やりたかったタイムスタンプ「数値」(Unix Epoch)からの変換機能を体験。タイムスタンプの各種変換はJSONataにお任せするのが正解?

※「ブロックを積みながら」投稿順 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ノードが2つあります。

第1のInjectノードからはテスト用のJSONオブジェクトが送り出されます。それを手ぐすね引いて待ち構えている change ノードの JSONataクエリ群に通すとそれぞれ所望の処理がされてデバッグ用のウインドウに結果が表示されます。

第2のInjectノードは、デフォルトのままタイムスタンプ値を送り出します。タイムスタンプは現在時刻を表していますが、やたらと桁の長い数値(1970年1月1日 UTCからの経過ミリ秒、Unix Epoch)でしかありません。それをchangeノードのJSONataクエリを使って人間可読な表現にしてみよういう目論見。

JSONataTrain3flow

タイムスタンプ値の可読文字列化

JSONataの組み込み関数に $fromMillis() あり。引数にUnix Epochのミリ秒を与えると各種形式文字列に変換してくれるのであります。

最初は書式指定文字列なし、成り行きで変換お願いの場合。JSONataの式は以下のようです。fromMillis1Setting

続いては年月日を/で接続した表現のとりだし用に書式指定してみたもの。

fromMillis2Setting

デバッグウインドウへ送られた結果が以下に。ただし上記はとくにタイムゾーンを指定していないので、z、つまりグリニッジ標準時(GMT)、ということはUTCと同じタイムゾーン。fromMillisResult

テスト用のJSONオブジェクトから抽出して組み込み関数で処理

前回やったJSONエディタを「駆使して」(そんなたいそうなもんでもないが)テスト用のJSONオブジェクトを作りましたぞ。数値配列ary1と単独の数値f1を含むもの。InputJSON

まずは数値配列を抽出してその平均をもとめてみるJSONataが以下に。averageSetting

 

つづいて、数値配列の要素数を求めるJSONataが以下に。countSetting

結果が以下に(検算してないけど。)FuncResult1

お次は単独数値 f1 を切り捨て($floor)floorSetting

切りあげ($ceil)もあり

ceilSetting

結果が以下に。

FuncResult2

今度はべき乗($power)、今回は控えめに2乗とな。powerSetting

勿論平方根($sqrt)もとれます。

sqrtSetting

結果が以下に(やっぱり検算してないケド。)FuncResult3

そして、所望の数値表現文字列への変換($formatNumber)。今回は、有効数字4桁の指数表現にしてみました。こんな感じ。

formatNumberSetting

普通に四捨五入、ただし小数点以下2桁目まで有効の場合。roundSetting

結果が以下に。FuncResult4

JSONata、ホント便利だわ。以前、Fuctionノードで自前でJavaScript書いていた私はおバカさん。

ブロックを積みながら(96) Node-REDのJSONビジュアルエディタ へ戻る

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