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] = valueJsonArray 类型用于将数组作为任何键的值添加。上面的代码很好地解释了这一点(对于键“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 示例。

更新于:2021年7月26日

6000+ 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告