ブロックを積みながら(80) Node-RED、jsonノードで文字列とオブジェクト相互変換

Joseph Halfmoon

今回はjsonノードです。文字列とNode-REDの主要データ構造であるJSONオブジェクトを相互変換できるもの。実用的には変換時にSchemaによるバリデーションを行えることが重要かと。でもね、面倒臭いのよSchema。今日のところは自分で自分にデータを投げつけているだけなので省略。いいのか、そういうことで。

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

今回のJSONノードは、単なる文字の羅列であるJSON文字列とプログラムで操作可能なJSONオブジェクトの間を相互変換してくれるノードです。用途としてはネットから送られてきたり、テキストファイルから読み出したJSON文字列をNode-RED内で処理可能にすること。あるいは逆にNode-REDから外部に出力するためにオブジェクトを文字列化するもの。

ある組織(システム)から他の組織(システム)にデータを送るような場合、あっちゃとこっちゃでデータ構造に誤解があると大問題です。そこでschemaと呼ばれるような、データ構造を「キッチリ」抑える定義を用いて検証し「ちゃんと適合しているもんね」ということで受け入れを決めることになるのだと思います。XMLしかり、そして今回のJSONしかり。JSONノードもこの機能をもっています。とは言え、schemaは厳格で、正直メンドイので JSONノード初回の今回はパスです。単に変換のみ。schemaによるバリデーションはまた別の機会に勉強することにしたいと思います。よわよわだな自分。

今回実験につかったフロー

今回実験したNode-REDフローが以下です。

Flow

    1. 左端のInjectノードで「JSON文字列」サンプルをpayloadに載せて送出する
    2. 次段、STR2JSONという名のjsonノードで、これをjsonオブジェクトに変換する
    3. 最後、JSON2STRという名のjsonノードで、上記のjsonオブジェクトを再び文字列に変換する
    4. この様子を順次DebugノードでDebug Windowに出力し、観察する
各ノードの設定

Injectノードの設定が以下に。シンプル極まりないですが「JSONになる文字列」を1つmsg.payloadに載せて送出します。値のところが「a z」、つまり文字列に設定してあるのをご確認くだされ。

Inject

第1のjsonノードは以下です。jsonノードは文字列からオブジェクト、あるいはオブジェクトから文字列への「単方向」動作に限定することもできます。しかしデフォルトの「相互変換」にしておけば、到来したものが文字列ならばオブジェクトへ、オブジェクトが到来したら文字列へとよきに計らってくれます。

json1setting

第2のjsonノードの設定は以下です。こちらはオブジェクトから文字列への変換を行うのですが、動作はやかり「おまかせ」です。ただ下の方の「JSON文字列フォーマット」にチェックを入れてあります。これにより美しくフォーマットされた文字列出力が得られる筈。

json2setting

実行結果

Injectノードを押したときの実行結果が以下に。上から

    1. Inject Nodeから送出された文字列(ダブルクォーテーション)
    2. 最初のjsonノードでオブジェクト変換されたもの
    3. 2番目のjsonノードで文字列の戻されたもの(美麗フォーマット済)

DebugWindow

まあ、変換するだけなら簡単だと。ちゃんとschemaやるんだろーな、自分。

ブロックを積みながら(79) Node-RED、watchノードでファイルを監視 へ戻る

ブロックを積みながら(81) Node-RED、yamlノードでオブジェクトと相互変換 へ戻る