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が開発したライブラリになります。 https://github.com/dropbox/json11
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
型へ変換したい場合は次のようにプログラミングします。
= "Hello";
String hoge std::string fuga = hoge.c_str();
また逆に、std::string
型をArduino言語のString
型へ変換したい場合は次のようにプログラミングします。
std::string fuga = "Hello";
= fuga.c_str(); String hoge
json11を使ってJSON文字列を配列へ変換する
json11を使ってJSON文字列を配列(Jsonオブジェクト)へ変換するには次のようにプログラミングします。
#include "Arduino.h"
#include "json11.hpp"
using namespace json11;
void setup() { Serial.begin(115200); }
void loop() {
= R"({"device_name": "esp32", "temperature": 21.6})";
String json std::string err;
= Json::parse(json.c_str(), err);
Json obj
= obj["device_name"].string_value().c_str();
String device_name float temperature = obj["temperature"].number_value();
.println(device_name);
Serial.println(temperature);
Serial.println(err.c_str());
Serial
(2000);
delay}
std::string
と String
の型変換がちょっとややこしいですが、json11を使えばjsonの値に簡単にアクセスできるようになりました!
json11を使ってJsonオブジェクトからJSON文字列に生成する
今度は逆に、JsonオブジェクトからJSON文字列を生成してみます。
#include <Arduino.h>
#include "json11.hpp"
using namespace json11;
void setup() { Serial.begin(115200); }
void loop() {
= Json::object{
Json jsonObj {"device_name", "esp32"},
{"status", false},
{"temperature", 21.6},
{"order", Json::array{1, 2, 3}},
};
std::string jsonStr = jsonObj.dump();
.println(jsonStr.c_str());
Serial
(5000);
delay}
上記のプログラムをESP32で実行すると、次のようにJSON文字列がシリアルモニタで出力されます。
{"device_name": "esp32", "order": [1, 2, 3], "status": false, "temperature": 21.600000000000001}
json11はMITライセンスで配布されてます。他にもJSONを扱いやすくするライブラリとして、 ArdinoJson(MITライセンス) や Arduino_JSON(LGPLライセンス) もあります。
関連記事
- 【Arduino開発】Platform IOでdebug版、release版を分けてビルドして実機へアップロードする方法
- AndroidアプリのSLiteデータベースをローカル環境にコピーする方法
- ArduinoでLCDに文字表示
- 【Arduino】OLEDに文字表示【Seeeduino】
- ESP32(Arduino)で擬似マルチスレッド可能な「PollingTimer」ライブラリ開発のリリースノート