1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ArduinoJson:ネストした配列に要素を追加する

Last updated at Posted at 2022-11-30

M5StackでArduinoJsonでJSONをデータファイル的に使おうとしていたのですが、
探し方が悪いせいか見つからなかったのでドキュメントを読んでコネコネしてたらできるようになったので備忘録として残します。

操作するJSONはこんな感じです。

{
  "json": [
    {
      "id": "000",
      "uid": "764D6925",
      "scandate": " 2022/11/23 03:33:33",
      "expire": "1669401213"
    }
  ]
}

トップレベルの"json"は必要なかったんですがdeseriarize出来なかったので追加しています。

M5StackのSDカードからdata.jsonを読み込んでdeseriarizeします。
SDカードではなくSPIFFSとか使うなら読み替えてください。

手順としては
・streamからdeseriarizeしてJsonDocumentを取得する
(deserializeするとFileオブジェクトに書き込めなくなるので開きなおす)
・既存のJSONのid要素を取得する→searchNewestId()
・追加する配列要素のJsonDocumentを作成(idを+1する)
・deseriaizeしたJsonDocumentから"json"をrootとするJsonArrayを取得
・JsonArrayにadd()する

になります。

 
  // SDカードから読み込む
  File f = SD.open("/data.json");

  DynamicJsonDocument jsonDocument(1024);
  // deseriarizeする
  DeserializationError error = deserializeJson(jsonDocument, f);
  // deseriarizeするとFileオブジェクトに書き込めなくなるので一度開きなおす
  f.close();
  File f = SD.open("/data.json");

  if (error) {
    // data.jsonが空

    Serial.print("data.json is empty.\n");
    Serial.println(error.c_str());
  }
  else {
    // deseriarize成功
    Serial.print("deserialized:\n");
    // serializeJsonPretty(jsonDocument, Serial);
    // Serial.println();
    // 一番古いidを取得
    int newestId = searchNewestId(jsonDocument);
    Serial.printf("newestId:%d\n", newestId);

    // rootを"json"とする配列を取得
    JsonArray jsonArray = jsonDocument["json"].as<JsonArray>();
    // 追加する要素を作成
    JsonObject obj = jsonArray.createNestedObject();
    char buf[4];
    sprintf(buf, "%03d", newestId + 1);
    obj["id"] = buf;
    // json_0["uid"] = data.uidChar;
    obj["uid"] = "12345678";
    obj["scandate"] = "2022/11/23 03:33:33";
    obj["expire"] = "1669401213";


    // jsonを表示
    serializeJsonPretty(jsonDocument, Serial);
    Serial.println();
    // SDカードに書きこむ
    serializeJsonPretty(jsonDocument, f);
    Serial.printf("JSON Wrote to SD Card\n");
  }
  f.close();

int searchNewestId(JsonDocument &jsonDocument) {

  // "json"をrootにする配列を取得
  JsonArray array = jsonDocument["json"].as<JsonArray>();
  int size = array.size();
  // Serial.printf("array size:%d\n", size);

  // 配列の最後の要素を取得
  JsonObject object = array[size - 1];
  // id(文字列)を取得してintに変換
  const char *json_item_id = object["id"];
  int jsonIdInt = 9;
  sscanf(json_item_id, "%d", &jsonIdInt);

  // Serial.printf("jsonId:%s\n", json_item_id);
  // Serial.printf("jsonIdInt:%d\n", jsonIdInt);
  return jsonIdInt;
}

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?