介绍
在本教程中,我们将检查如何使用ArduinoJson 库在 ESP32 上序列化 JSON 。
可以使用 Arduino IDE 库管理器安装此库。打开该工具后,只需搜索“ArduinoJson”,如图1所示。
图 1 – 从 Arduino IDE 库管理器安装 ArduinoJson。
您还可以使用库管理器更新到最新版本,即版本 6。
请注意,在之前的教程中,我们已经介绍了 ArduinoJson 库的一些功能,但适用于旧版本。如前所述,在这里我们将介绍最新版本。
此版本引入了对以前 API 的一些更改。您可以在此处阅读有关从版本 5 迁移到版本 6 的一些信息。
此处显示的测试是使用 DFRobot 的ESP32 板执行的 。
编码
我们要做的第一件事是包含ArduinoJson库,这样我们就可以访问序列化 JSON 所需的函数。
1
|
#include <ArduinoJson.h>
|
然后我们将继续使用 Arduino 设置功能,我们将在其中编写其余代码。我们将首先打开一个串行连接,以输出我们程序的结果。
1
|
Serial.begin(115200);
|
然后我们将声明一个StaticJsonDocument类的对象。它将保存我们对象 [1] 的内存表示。
请注意,StaticJsonDocument是JsonDocument的派生类,其特殊性在于内存是在堆栈上分配的 [2]。另一种方法是DynamicJsonDocument,其中内存在堆上分配 [2]。对于本教程,我们将仅使用StaticJsonDocument类。
使用StaticJsonDocument的优点之一是速度稍快,因为它不依赖于动态内存分配 [3]。
尽管如此,对于较大的文档,不建议使用StaticJsonDocument,以避免堆栈溢出问题 [3]。在库文档中,建议我们对小于 1 KB 的文档使用StaticJsonDocument ,对大于 1 KB 的文档使用DynamicJsonDocument [4]。
在我们的代码中,我们需要在模板参数上指定StaticJsonDocument的容量。该值在字节 [2] 中指定。
当然,我们分配的容量取决于 JSON 文档的复杂性。您可以使用此助手来帮助您确定您的用例所需的大小。还有一些宏可以帮助计算所需的大小,例如
JSON_OBJECT_SIZE。
尽管如此,对于我们的简单教程,我们将使用 100 字节的容量,这对于我们要表示的对象来说已经绰绰有余了。
1
|
StaticJsonDocument<100> testDocument;
|
然后,要向我们的文档添加一个新成员,我们只需要使用下标运算符 []即可。您可以检查以下语法以添加我们的 JSON 的两个成员。
1
2
|
testDocument[ "sensorType" ] = "Temperature" ;
testDocument[ "value" ] = 10;
|
请注意,我们正在模拟具有以下结构的 JSON 对象,表示假设的传感器测量:
1
2
3
4
|
{
"sensorType" : "temperature" ,
"value" : 10
}
|
回到我们的 Arduino 代码,要将文档序列化为 JSON 字符串,我们需要一个 char 缓冲区来存储它。
1
|
char buffer[100];
|
然后,要获取 JSON 字符串,我们只需要调用serializeJson函数即可。作为第一个输入,我们需要传递我们的StaticJsonDocument对象,第二个输入是我们之前声明的字符缓冲区。
请注意,此函数调用将输出一个缩小的字符串,这意味着它不会有空格或换行符 [5]。当然,这占用的空间更少,但对于人类来说阅读起来要困难得多。如果你想获得一个修饰过的字符串(足够人类阅读),你应该使用serializeJsonPretty函数。
1
|
serializeJson(testDocument, buffer);
|
最后,我们将打印在我们的 char 缓冲区中获得的内容。它应该显示一个包含我们的 JSON 文档的字符串。
1
|
Serial.println(buffer);
|
最终代码如下所示。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include <ArduinoJson.h>
void setup() {
Serial.begin(115200);
StaticJsonDocument<100> testDocument;
testDocument[ "sensorType" ] = "Temperature" ;
testDocument[ "value" ] = 10;
char buffer[100];
serializeJson(testDocument, buffer);
Serial.println(buffer);
}
void loop() {
}
|
测试代码
要测试代码,只需编译它并使用 Arduino IDE 将其上传到您的设备。程序完成后,打开 Arduino IDE 串行监视器。您应该得到类似于图 2 的输出,其中显示了正在打印的 JSON 字符串。
图 2 – 程序的输出,显示 JSON 字符串。
相关内容
建议的 ESP32 读数
参考
[1] Serialization tutorial | ArduinoJson 6
[2] Deserialization tutorial | ArduinoJson 6
[3] StaticJsonDocument | ArduinoJson 6
[4] JsonDocument | ArduinoJson 6
[5] serializeJson() | ArduinoJson 6