ArduinoJSON:序列化和反序列化
ArduinoJSON 库,顾名思义,可以帮助您在 Arduino 上处理 JSON 对象。要安装它,请转到库管理器,然后搜索 ArduinoJSON。安装由 Benoit Blanchon 编写的库。

这是一个文档非常丰富的库。事实上,它有自己的网站:https://arduinojson.org/。您可以在此网站上找到几个问题的答案。
在本文中,我们将研究如何使用此库进行序列化(生成 JSON 文档)和反序列化(解析 JSON 文档)。
序列化
让我们从序列化开始。它非常简单。如果您使用过 Python,代码看起来会更加熟悉。
下载 ArduinoJSON 库后,请转到 - File>Examples>ArduinoJSON
关于序列化,我们应该查看的示例是 JsonGeneratorExample。您会注意到代码中有大量注释,建议您仔细阅读示例中的注释。
没有注释的代码如下所示 −
#include <ArduinoJson.h>
void setup() {
Serial.begin(9600);
while (!Serial) continue;
StaticJsonDocument<200> doc;
doc["sensor"] = "gps";
doc["time"] = 1351824120;
JsonArray data = doc.createNestedArray("data");
data.add(48.756080);
data.add(2.302038);
serializeJson(doc, Serial);
Serial.println();
serializeJsonPretty(doc, Serial);
}
void loop() {
}
输出
代码基本不言自明。串行监视器输出如下所示 −

需要注意的几点 −
向 JSON 添加键值对的语法如下 − doc_name[key] = value。JsonArray 类型用于将数组添加为任何键的值。上面的代码很好地解释了这一点(对于键"data"而言)。
serializeJSON 接受两个参数:JSON 文档和目标缓冲区。因此,与其直接打印到串口,不如使用 −
serializeJson(doc, serializedJSON); Serial.println(serializedJSON);
输出结果是一样的
反序列化
反序列化与序列化相反。您有一个 JSON 文档(它可能来自任何来源,例如串口、Web 服务器等),并且希望对其进行解析。请前往 - 文件 → 示例 → ArduinoJSON 并打开 JsonParserExample。这段代码注释非常丰富,建议您仔细阅读示例中的注释。
示例
如果没有注释,代码如下 −
#include <ArduinoJson.h>
void setup() {
Serial.begin(9600);
while (!Serial) continue;
StaticJsonDocument<200> doc;
char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
DeserializationError error = deserializeJson(doc, json);
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
return;
}
const char* sensor = doc["sensor"];
long time = doc["time"];
double latitude = doc["data"][0];
double longitude = doc["data"][1];
Serial.println(sensor);
Serial.println(time);
Serial.println(latitude, 6);
Serial.println(longitude, 6);
}
void loop() {
}
输出
串行监视器输出为 −

如您所见,反序列化语法为 deserializeJson(doc, json),如果有错误,它会返回一个错误。它接受两个参数:用于存储反序列化输出的 JSON 文档,以及包含 JSON 内容的缓冲区。
获得反序列化内容后,从中提取内容的语法如下 −
data_type var_name = doc[key]
建议您也阅读其他 ArduinoJSON 示例。

