正如我在评论中提到的,如果您在 SD 中保存数据(并编写 C++),则无需添加额外的 JSON 编码/解码层,您可以使用 C++ 结构读取和写入数据。
在展示如何将结构读/写到文件中之前,您显示的结构不会保存您要表示的数据,每个鸡尾酒配方都由名称(一个字符串)和一个成分数组组成,每种成分都包含一个表示酒类和份量类型的字符串和字节。所以我们正在处理一个结构中的一个结构。
typedef struct {
char liquor[20];
uint8_t portion;
} Ingridient;
typedef struct {
char name[20];
Ingridient ingridients[7];
} Cocktail;
Cocktail cocktails[] = {
{"Americano", { {"campari", 1}, {"red vermouth", 2}, {"soda", 3} } },
{"Aviation", { {"gin", 1}, {"cherry liqueur", 2}, {"creme de violette", 3}, {"lemon juice", 4} } },
{"B52 Cocktail", { {"kahlua", 1}, {"baileys", 2}, {"trand marnier", 3} } }
};
将 struct 写入文件或从文件中读取 struct 就像将一系列字节写入文件一样,您需要做的就是告诉您的 struct 在内存中的位置(即指向 struct 的指针),以及是结构的大小。
由于我没有带 SD 卡的 Arduino,所以我在 ESP32 上使用 SPIFFS 展示它,它应该与 SD 非常相似,并且您应该没有问题将代码转换为与 SD 卡一起使用。
这是完整的示例。
#include <SPIFFS.h>
typedef struct {
char liquor[20];
uint8_t portion;
} Ingridient;
typedef struct {
char name[20];
Ingridient ingridients[7];
} Cocktail;
void setup() {
Serial.begin(115200);
Cocktail cocktails[] = {
{"Americano", { {"campari", 1}, {"red vermouth", 2}, {"soda", 3} } },
{"Aviation", { {"gin", 1}, {"cherry liqueur", 2}, {"creme de violette", 3}, {"lemon juice", 4} } },
{"B52 Cocktail", { {"kahlua", 1}, {"baileys", 2}, {"trand marnier", 3} } }
};
if(!SPIFFS.begin()){
Serial.println("Error while mounting SPIFFS");
return;
}
//--------- Write a struct to file
File fileToWrite = SPIFFS.open("/cocktails.txt", FILE_WRITE);
if(fileToWrite) {
for (int i=0; i<3; i++) {
fileToWrite.write( (uint8_t *) &cocktails[i], sizeof(cocktails[i]) );
}
}
fileToWrite.close();
//---------- Read a struct from file
Cocktail c[3]; //struct for holding the content from the file
File fileToRead = SPIFFS.open("/cocktails.txt");
if(fileToRead) {
Serial.println("Data from file...");
for (int i=0; i<3; i++) {
fileToRead.read( (byte *) &c[i], sizeof(c[i]) );
Serial.println(c[i].name);
int n = 0;
while (strlen(c[i].ingridients[n].liquor)) {
Serial.print(c[i].ingridients[n].liquor);
Serial.print(" - ");
Serial.print(c[i].ingridients[n].portion);
n++;
}
Serial.println();
}
}
fileToRead.close();
}
void loop() {}