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が開発したライブラリになります。

Arduinoではそのままでは動作しませんが、ESP32であればそのままライブラリを導入し利用可能です。

開発環境

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

項目
Arduino ESP32-DevKitC
IDE Platform IO
ファームウェア arduino-esp32#2.0.2
json11 v1.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型へ変換したい場合は次のようにプログラミングします。

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);
}

std::stringString の型変換がちょっとややこしいですが、json11を使えばjsonの値にカンタンにアクセスできるようになりました!

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ライセンス) もあります。

「キッチンノート.fun」という料理サイトを立ち上げました!このサイトで紹介していた料理記事は、そちらへ移動しました。
記事に関するご質問などがあれば、
Twitter または お問い合わせ までご連絡ください。
関連記事