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

Joseph Halfmoon

第38回でChangeノードを実習したときに「この際JSONataを勉強せねばと思いました」などと書きながら、それきりになってました。1年以上ぶりに今回からJSONataのキホンを勉強していきたいと思います。JSONオブジェクトが飛び回るNode-RED世界の中でJSONataはNode-REDの真の友、ホントか?

※「ブロックを積みながら」投稿順 index はこちら

※動作確認にはRaspberry Pi 3 model B+のRaspberry Pi OS(32bit)上にインストールした以下を使用しています。

    • Node-RED v2.0.5
    • node-red-dashboard 3.2.0
JSONata

JSONataは、XMLにおけるXPathみたいなものであります。複雑な構造をもつJSONオブジェクトから必要な要素を簡単に取り出すことができると。また、取り出した要素について各種の処理を施すこともできます。JSONataのホームページは以下に。

JSONata

本シリーズでは、第38回のChangeノード、第39回と第40回のSwitchノードで使わせていただいております。

必要な処理を行えるノードが見当たらない場合、functionノードでJavaScriptを書いて処理させるのも手ですが、ChangeノードのJSONataを使えば結構な処理ができそうです。さらから書くよりもラクチンではないかと。

練習フローその1

まずは単純な抽出処理から練習していきたいと思います。使用したフローは以下です。左灰色のInjectノードからJSONオブジェクトを投げ、真ん中の3種類のchangeノードで処理して結果をデバッグウインドウに送ってます。

trainJSONata1Flow

処理対象のJSONオブジェクトは以下のようです。プロパティが3つ。正の整数、負の整数、そして配列が載ってます。KeyAKeyBJson

まずは、単純にプロパティ KeyAの値を抽出するクエリ。これはそれほどありがたみがないっす。

changeExtKeyA

続いてKeyBの値を抽出した後に、絶対値関数を呼び出すもの。JSONataには$はじまりの名前が付けられている充実の各種関数が用意されているのであります。changeAbsKeyB

最後はKeyCの配列の要素1(0はじまりなので2番目の要素)を取り出すもの。changeKeyCElem1

デバッグウインドウに出力されたフロー1の結果が以下に。ちゃんと絶対値もとられているし、配列要素にもアクセスできておりますな。

Flow1Results

練習フローその2

続いて多少「構造」をもったJSONオブジェクトの練習に進みます。フローは以下のようなもの。trainJSONata2Flow

INJECTノードから送り出すJSONオブジェクトは以下のようなもの。シンプルだけれどもデータベースに見えないこともない。

MCUListJson

最初は上記から MCUプロパティが ESP32C3 である「レコード」を取り出すもの。changeESC32C3rec

続いて、取り出した「レコード」から、COREプロパティ(フィールド)の値のみ抽出。changeESC32C3core

つづいて、COREプロパティが”ARM Cortex-M4F”であるものを列挙せよ、と。そうです。元のJSONオブジェクト内には複数存在しておりますがな。changeCortexM4F

実行結果が以下に。上記の複数の「レコード」にヒットするクエリは配列を返してきていることがわかります。Flow2Results

これだけでも十分便利だけれども、JSONataにはまだまだ強力機能があるみたい。

ブロックを積みながら(94) Node-RED、werial-requestノード へ戻る

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