最近ArduinoというかESP32というかM5StickC Plusをいじって遊んでいますが、ふと「jsonって扱えたりするのかな」と思って調べてみるとすでにそういうライブラリがいくつか存在することがわかりました。
その中で今回は「ArduinoJson」というライブラリを使ってみたのでその備忘録です。
では、始めます。
1:ArduinoJsonライブラリについて
ArduinoJsonの公式ページは以下のリンクです。
今回は公式ページのDocumentationのInstallationの「Option 1」に沿ってやっていきます。
その他にもスケッチ例など様々な情報が公式ページにあるので、詳しく知りたい場合は各自で参照してください。
2:ArduinoJsonライブラリのインストール
Arduino IDEを起動させてメニューの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を選択します。
ライブラリマネージャの画面が出てくるので検索欄に「arduinojson」と入力してEnterキーを押し、出てきた一番上にある「Arduino Json」とかかれたライブラリの「インストール」ボタンをクリックします。
Arduino Jsonのライブラリに「INSTALLED」の文字が出ていたらインストール完了です。
3:ArduinoJsonを使ってみる
インストールができたので、とりあえず文字列のjsonから値を取得してみます。
基本的な記述方法は以下のようになります。
#include <ArduinoJson.h> char json[] = "{\"hello\":\"world\"}"; // json文字列 StaticJsonDocument<64> doc; // メモリを確保(静的) // DynamicJsonDocument doc(64); // メモリを確保(動的) deserializeJson(doc, json); // json形式に変換 const char* world = doc["hello"]; // 値の取り出し
StaticJsonDocumentは静的、DynamicJsonDocumentは動的な場合に使用します。StaticJsonDocumentの方が処理が速いらしいのでできる限りこちらを利用するのが良いかと思います。
このStaticJsonDocumentまたはDynamicJsonDocumentを使用する際には予めメモリを確保しておく必要があります。メモリをどのぐらい確保するべきかは次に紹介する「ArduinoJson Assistant」を使うと簡単です。
4:ArduinoJson Assistantの使い方
例えば以下のようなjsonがあったとします。
{ "test": "hello", "value": 314 }
このjsonから値を取得する際のStaticJsonDocumentまたはDynamicJsonDocumentのメモリを計算していきます。
始めに「ArduinoJson Assistant」のページを開きます。
開くと「Processor」、「Mode」、「Input type」の項目があるので、プルダウンから選んでいきます。
今回は「文字列として受け取ったjsonをM5StickC Plusで使いたい」のでProcessorは「ESP32」、「Mode」は「Deserialize」、「Input type」は「String」を選択して「Next:JSON」をクリックします。
テキストボックスのある画面が表示されるので、取得したいjsonを入力して「Next:Size」をクリックします。ちなみに右下にある「Prettify」をクリックするとjsonを見やすい形に整形してくれます。
この画面でメモリサイズの計算結果が表示されます。ここの数値を使えば良いのですが「Next:Program」をクリックするとサンプルのコードが表示されます。
「Next:Program」をクリックしてみると以下のようにサンプルコードが表示されるのでコピペしてそのまま使うことができます。
5:実際に動かしたスケッチ
サンプルコードだけを見てもどう使うかイマイチわからないかもしれないので、実際にスケッチにして使ってみます。
4の例と同じ以下のjsonとします。
{ "test": "hello", "value": 314 }
このjsonのそれぞれの項目の値を取得してM5StickC Plusの画面に表示させるスケッチは以下の通りです。
・M5StickCPlus_json_test.ino
#include <M5StickCPlus.h> #include <ArduinoJson.h> void setup() { Serial.begin(115200); M5.begin(); M5.Axp.ScreenBreath(10); // 画面の明るさ(7-12) M5.Lcd.setRotation(0); // 画面を縦向きに(0-3) M5.Lcd.setTextSize(2); // フォントサイズは2 // jsonの文字列 String jsonStr = "{ \"test\": \"hello\", \"value\": 314 }"; // メモリを確保してjsonに変換 StaticJsonDocument<64> doc; // DynamicJsonDocument doc(64); // 動的な場合はこっち DeserializationError error = deserializeJson(doc, jsonStr); if (error) { // エラーの場合 M5.Lcd.print(F("deserializeJson() failed: ")); M5.Lcd.println(error.f_str()); } else { // 正常な場合は値を取得して表示 const char* test = doc["test"]; int value = doc["value"]; M5.Lcd.print("test: "); M5.Lcd.println(test); M5.Lcd.print("value: "); M5.Lcd.println(value); } Serial.println("setup end"); } void loop() { }
このスケッチを実行すると以下のようにちゃんとjsonの値が取得でき、画面に表示されています。
以上がArduinoでjsonを扱うためのライブラリ「ArduinoJson」についてです。
今回はESP32というかM5StickC Plusでやりましたが、普通のArduino Unoなどでも使えると思うので割と色々便利そうです。
・参考資料