ArduinoJSON:序列化和反序列化

arduinohardwaresoftware & coding更新于 2026/1/12 8:37:17

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 示例。


相关文章