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