ArduinoJSON:序列化和反序列化
顾名思义,ArduinoJSON 库可以帮助你在 Arduino 上处理 JSON 对象。要安装它,请转到库管理器,搜索 ArduinoJSON。安装 Benoit Blanchon 编写的库。
这是文档非常完善的库之一。事实上,它有自己的网站:https://arduinojson.org/。你可以在这个网站上找到许多问题的答案。
在本文中,我们将学习如何使用这个库进行序列化(生成 JSON 文档)和反序列化(解析 JSON 文档)。
序列化
让我们从序列化开始。它非常简单。如果你使用过 Python,这段代码看起来会更加熟悉。
下载 ArduinoJSON 库后,转到 - 文件→示例→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 示例。