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 のドキュメントは以下です。
今回実験に使ったフロー
今回の実験に使ったフローには左にInjectノードが2つあります。
第1のInjectノードからはテスト用のJSONオブジェクトが送り出されます。それを手ぐすね引いて待ち構えている change ノードの JSONataクエリ群に通すとそれぞれ所望の処理がされてデバッグ用のウインドウに結果が表示されます。
第2のInjectノードは、デフォルトのままタイムスタンプ値を送り出します。タイムスタンプは現在時刻を表していますが、やたらと桁の長い数値(1970年1月1日 UTCからの経過ミリ秒、Unix Epoch)でしかありません。それをchangeノードのJSONataクエリを使って人間可読な表現にしてみよういう目論見。
タイムスタンプ値の可読文字列化
JSONataの組み込み関数に $fromMillis() あり。引数にUnix Epochのミリ秒を与えると各種形式文字列に変換してくれるのであります。
最初は書式指定文字列なし、成り行きで変換お願いの場合。JSONataの式は以下のようです。
続いては年月日を/で接続した表現のとりだし用に書式指定してみたもの。
デバッグウインドウへ送られた結果が以下に。ただし上記はとくにタイムゾーンを指定していないので、z、つまりグリニッジ標準時(GMT)、ということはUTCと同じタイムゾーン。
テスト用のJSONオブジェクトから抽出して組み込み関数で処理
前回やったJSONエディタを「駆使して」(そんなたいそうなもんでもないが)テスト用のJSONオブジェクトを作りましたぞ。数値配列ary1と単独の数値f1を含むもの。
まずは数値配列を抽出してその平均をもとめてみるJSONataが以下に。
切りあげ($ceil)もあり
結果が以下に。
勿論平方根($sqrt)もとれます。
そして、所望の数値表現文字列への変換($formatNumber)。今回は、有効数字4桁の指数表現にしてみました。こんな感じ。
JSONata、ホント便利だわ。以前、Fuctionノードで自前でJavaScript書いていた私はおバカさん。