Jsonフォーマットをパースして文字列を取り出す
(注意)本記事ではArduinoJson 6.15.1を取り扱っています。バージョン外の場合動作しない場合がありますのでご了承ください。
こんにちは、くろべこです。
先日、HttpClientのGETリクエストでJSONフォーマットデータを取り出しましたが、このままではArduinoで特定の値として取り出すことが出来ません。
そこで今回は、<ArduinoJson.h>というヘッダファイルを使用してJsonデータから特定の文字列を取り出していきたいと思います。
Jsonデータから特定の文字列を取り出すことが出来れば、ウェブページにアクセスして外部表示機に値を表示したり出来そうですね。
Jsonデータをパースするには
今回パースを行うにあたり題材とするJsonデータは【COVID-19 Japan Web API】の北海道のデータを使用します。
リンク:https://documenter.getpostman.com/view/9215231/SzYaWe6h?version=latest
1 2 3 4 5 6 7 8 9 10 11 |
[ { "id": 1, "name_ja": "北海道", "name_en": "Hokkaido", "lat": 43.46722222, "lng": 142.8277778, "cases": 188, "deaths": 8 } ] |
このJsonデータをどのようにパースするかというと、、、実はArduinoJSONには素晴らしいツールがありまして、まずは以下の【ArduinoJson Assistant】にアクセスしてみてください。
このツールではJsonドキュメントのメモリとJsonフォーマットから文字列への変換プログラムを提供してくれます。
ということで、先ほどのJsonファイルをArduinoJson AssistantのINPUTにコピペしてみましょう。
メモリーサイズが181byteと計算されましたね。
変換プログラムも構築してくれました。これでほぼほぼ、プログラムは完成されたといっても過言ではありません。では、実際にArduinoコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include <ArduinoJson.h> void setup() { // Initialize Serial port Serial.begin(9600); // Allocate the JSON document // Use arduinojson.org/v6/assistant to compute the capacity. const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(9) + 120; DynamicJsonDocument doc(capacity); const char* json = "[{\"id\":1,\"name_ja\":\"北海道\",\"name_en\":\"Hokkaido\",\"lat\":43.46722222,\"lng\":142.8277778,\"cases\":188,\"deaths\":8}]"; // Parse JSON object DeserializationError error = deserializeJson(doc, json); switch (error.code()) { case DeserializationError::Ok: Serial.println(F("Deserialization succeeded")); break; case DeserializationError::InvalidInput: Serial.println(F("Invalid input!")); break; case DeserializationError::NoMemory: Serial.println(F("Not enough memory")); break; default: Serial.println(F("Deserialization failed")); break; } JsonObject root_0 = doc[0]; int root_0_id = root_0["id"]; // 1 const char* root_0_name_ja = root_0["name_ja"]; // "北海道" const char* root_0_name_en = root_0["name_en"]; // "Hokkaido" float root_0_lat = root_0["lat"]; // 43.46722222 float root_0_lng = root_0["lng"]; // 142.8277778 int root_0_cases = root_0["cases"]; // 188 int root_0_deaths = root_0["deaths"]; // 8 // Extract values Serial.println(root_0_name_ja); Serial.println(root_0_cases); Serial.println(root_0_deaths); } void loop() { } |
<<シリアルモニタ>>
という事で、あっさりJSONフォーマットから特定の文字列を抜き取るわけが出来ました。
どのように変換しているかというとdeserializeJsonという関数を使用してJSONフォーマットを逆シリアル化(デコード)してあげるんですね。戻り値としては逆シリアル化のエラー(DeserializationError)を返します。
そして、switch case文でエラーコードに対して分岐させてステータスをシリアル表示させています。変換が成功すれば上記のシリアルモニタ画像にもある様に【Deserialization succeeded】と表示されます。
この関数たちは最新バージョンのV6から導入された関数なので、V6以前のバージョンの場合は使うことが出来ないのでご注意ください。
Jsonの逆シリアル化関数の詳細説明は以下の公式リンクに書かれています。
そして、逆シリアル化されたデータ(ここではdoc)から特定の値を取り出します。
今回のコードでは【北海道】【188】【8】を取り出します。そのために、オブジェクトからメンバを抜き取るような処理を行う事で特定の値を取り出すことが出来ます(C++の構文ですかね?)。
という事で、Jsonを逆シリアル化して値を取り出す記事でした!
コメント