Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

ArduinoでJSONを扱う「ArduinoJSON」

arduinoJSONを扱うライブラリに「ArduinoJSON」というのがあります。
IoT系で計測データをJSONで吐き出したかったり、あるいはJSONファイルをDSL風に使いたい場合にはとても重宝します。
ちなみに……Arduino-Jsonなんて名前ですが、OS XやWin、Linuxでも動くそうです。

実際のところ

ライブラリの追加

f:id:shuzo_kino:20160506185929p:plain
リストが出てくるので、JSONと入力し絞込。
f:id:shuzo_kino:20160506190030p:plain
今回はArduinoJSONを使います
f:id:shuzo_kino:20160506190038p:plain
再起動かけると、ちゃんとライブラリが読み込まれます。
f:id:shuzo_kino:20160506190112p:plain

詳しい事は公式のページを見て下さい
Arduino - Libraries

動作確認。

基本、公式のサンプルをそのまんま。
ただ、著作権以外のコメントを日本語にしてみました。

// Copyright Benoit Blanchon 2014-2016
// MIT License
//
// Arduino JSON library
// https://github.com/bblanchon/ArduinoJson
// If you like this project, please add a star!

#include <ArduinoJson.h>

void setup() {
  Serial.begin(9600);

  // シリアルの初期化待ち
  while (!Serial) { }

  // JSON用の固定バッファを確保。
  //この例では200文字分。
  StaticJsonBuffer<200> jsonBuffer;

  // char[]の形式でJSONの文字列を持つ。
  // char* 形式では文字列のコピーを保持してしまうためヨロシクナイ
  char json[] =
      "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";

  // JsonObjectはJSONBufferに格納、パースされた結果を参照保持する。
  // データを参照する場合はこのJsonObjectを見に行く。
  // メモリはスコープから出た際に開放される。
  JsonObject& root = jsonBuffer.parseObject(json);

  // パースが成功したか確認。できなきゃ終了
  if (!root.success()) {
    Serial.println("parseObject() failed");
    return;
  }

  // データの取り出しは暗黙の型変換
  const char* sensor = root["sensor"];
  long time = root["time"];
  double latitude = root["data"][0];
  double longitude = root["data"][1];

  // データの表示。.
  Serial.println(sensor);
  Serial.println(time);
  Serial.println(latitude, 6);
  Serial.println(longitude, 6);
}

void loop() {
  // 今回は未使用
}

無事Arduinoに格納できれば、シリアルモニタでこんな感じの出力を確認出来るはずです
f:id:shuzo_kino:20160506211050p:plain

どれくらいネストできるのか

公式のwikiでは以下の様な例もパースできる事が示されています。
(このネスト数については設定次第で制限を掛けることもできるようです。)
Decoding JSON · bblanchon/ArduinoJson Wiki · GitHub

char json[] = "{\"data\":{\"time\":{\"day\":1,\"month\":3,\"year\":16,\"hours\":9,\"mins\":59,\"secs\":14}}}";

値を取り出す場合はよくある手筈のようにkey名を与えてあげるだけです。

  int day     = root["data"]["time"]["day"];

  Serial.print("Day:");
  Serial.println(day);

実行すれば、以下のように出てきます。

Day:1