ESP32でjson11を使ってJSONを簡単に扱う方法|JSON文字列のパース|配列をJSONに変換

ESP32でjson11を使ってJSONを簡単に扱う方法|JSON文字列のパース|配列をJSONに変換
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であればそのままライブラリを導入し利用可能です。

開発環境

この記事の執筆時では、次の開発環境でプログラムを実行テストしました。

項目
ArduinoESP32-DevKitC
IDEPlatform IO
ファームウェアarduino-esp32#2.0.2
json11v1.0.0

json11の使い方

json11の使い方を解説します。

json11ライブラリのインストール

dropbox/json11 から json11.cppjson11.hpp のソースコードをダウンロードして、.ino ファイルと同じディレクトリ下に配置してください。

Arduino言語のStringをstd::stringへ変換したい

json11ではC++の std::string型が使われますので、Arduino言語の String型へのキャストを行う必要が出てきます。json11を使う前に、その方法を押さえておきましょう。

Arduino言語のString型をstd::string型へ変換したい場合は次のようにプログラミングします。

cpp
String hoge = "Hello";
std::string fuga = hoge.c_str();

また逆に、std::string型をArduino言語のString型へ変換したい場合は次のようにプログラミングします。

cpp
std::string fuga = "Hello";
String hoge = fuga.c_str();

json11を使ってJSON文字列を配列へ変換する

json11を使ってJSON文字列を配列(Jsonオブジェクト)へ変換するには次のようにプログラミングします。

cpp
#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);
}
std::stringString の型変換がちょっとややこしいですが、json11を使えばjsonの値に簡単にアクセスできるようになりました!

json11を使ってJsonオブジェクトからJSON文字列に生成する

今度は逆に、JsonオブジェクトからJSON文字列を生成してみます。

cpp
#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文字列がシリアルモニタで出力されます。

json
{"device_name": "esp32", "order": [1, 2, 3], "status": false, "temperature": 21.600000000000001}

json11はMITライセンスで配布されてます。他にもJSONを扱いやすくするライブラリとして、 ArdinoJson(MITライセンス)Arduino_JSON(LGPLライセンス) もあります。

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

ESP32搭載ボード
ESP32の書籍
Arduinoで人気の周辺パーツ
M5Stackのオススメ参考書
M5Stack製品
M5StickCで使えるHat
ESP32ボード
関連記事