ESP32でjson11を使ってJSONを簡単に扱う方法|JSON文字列のパース|配列をJSONに変換
ESP32でjson11を使ってJSONを簡単に扱う方法をご紹介します。json11はJSON文字列をパースしたり、配列からJSON文字列を生成するライブラリです。C++11が使える環境ならjson11を利用できます。残念ながらArduinoではjson11を使うことはできませんが、ESP32ならC++11に対応してますので、json11を導入することが可能です。シンプルで使いやすいライブラリです。
json11とは
冒頭でも説明したとおり、json11はJSON文字列をパースしたり、配列からJSON文字列を生成するライブラリです。C+11以降で使用できます。オンラインストレージサービスで有名なDropboxが開発したライブラリになります。 GitHub - dropbox/json11: A tiny JSON library for C++11.
Arduinoではそのままでは動作しませんが、ESP32であればそのままライブラリを導入し利用可能です。
開発環境
この記事の執筆時では、次の開発環境でプログラムを実行テストしました。
項目 | 値 |
---|---|
Arduino | ESP32-DevKitC |
IDE | Platform IO |
ファームウェア | arduino-esp32#2.0.2 |
json11 | v1.0.0 |
json11の使い方
json11の使い方を解説します。
json11ライブラリのインストール
dropbox/json11 から json11.cpp と json11.hpp のソースコードをダウンロードして、.ino ファイルと同じディレクトリ下に配置してください。
Arduino言語のStringをstd::stringへ変換したい
json11ではC++の std::string型が使われますので、Arduino言語の String型へのキャストを行う必要が出てきます。json11を使う前に、その方法を押さえておきましょう。
Arduino言語のString型をstd::string型へ変換したい場合は次のようにプログラミングします。
String hoge = "Hello";
std::string fuga = hoge.c_str();
また逆に、std::string型をArduino言語のString型へ変換したい場合は次のようにプログラミングします。
std::string fuga = "Hello";
String hoge = fuga.c_str();
json11を使ってJSON文字列を配列へ変換する
json11を使ってJSON文字列を配列(Jsonオブジェクト)へ変換するには次のようにプログラミングします。
#include "Arduino.h"
#include "json11.hpp"
using namespace json11;
void setup() { Serial.begin(115200); }
void loop() {
String json = R"({"device_name": "esp32", "temperature": 21.6})";
std::string err;
Json obj = Json::parse(json.c_str(), err);
String device_name = obj["device_name"].string_value().c_str();
float temperature = obj["temperature"].number_value();
Serial.println(device_name);
Serial.println(temperature);
Serial.println(err.c_str());
delay(2000);
}
json11を使ってJsonオブジェクトからJSON文字列に生成する
今度は逆に、JsonオブジェクトからJSON文字列を生成してみます。
#include <Arduino.h>
#include "json11.hpp"
using namespace json11;
void setup() { Serial.begin(115200); }
void loop() {
Json jsonObj = Json::object{
{"device_name", "esp32"},
{"status", false},
{"temperature", 21.6},
{"order", Json::array{1, 2, 3}},
};
std::string jsonStr = jsonObj.dump();
Serial.println(jsonStr.c_str());
delay(5000);
}
上記のプログラムをESP32で実行すると、次のようにJSON文字列がシリアルモニタで出力されます。
{"device_name": "esp32", "order": [1, 2, 3], "status": false, "temperature": 21.600000000000001}
json11はMITライセンスで配布されてます。他にもJSONを扱いやすくするライブラリとして、 ArdinoJson(MITライセンス) や Arduino_JSON(LGPLライセンス) もあります。