这篇文章的目的是解释如何使用ESP32和ArduinoJson库解析JSON消息。
目录
介绍
这篇文章的目的是解释如何使用ESP32和ArduinoJson库解析JSON消息。
请注意,此程序与教程中有关在ESP8266上解析JSON的代码非常相似。
您可以通过Arduino IDE库管理器安装库,这是最简单的方法。只需在搜索栏上搜索ArduinoJson,如图1所示,你就可以选择它了。在撰写本文时,最新版本是5.9.0,这是本教程使用的版本。
图1 – 通过Arduino IDE库管理器安装ArduinoJson库。
代码
首先,我们需要包含前面提到的ArduinoJson库,这样我们就可以访问JSON解析功能了。由于我们要在主循环函数中进行实际的解析,我们只需在setup函数上设置好波特率,以便在串口监视器打印我们程序的输出:
#include "ArduinoJson.h"
void setup() {
Serial.begin(115200);
Serial.println();
}
之后,在循环函数上,我们将声明一个变量来保存要解析的JSON消息。请注意,/字符用于在声明的字符串上转义双引号。这是必需的,因为JSON名称需要双引号:
char JSONMessage[] = " {\"SensorType\": \"Temperature\", \"Value\": 10}"; //初始信息
JSON消息的结构如下所示,没有转义字符。请注意,这是一个虚拟示例,显示了用于发送传感器信息的可能消息结构:
{
"SensorType" : "Temperature",
"Value" : 10
}
重要:JSON解析器修改字符串[1],因此它的内容无法重用,即使在整个程序执行期间字符串相同也是如此。因此,我们在主循环中声明它而不是作为全局变量,保证当主循环函数返回时,它被释放并且在下一次调用循环函数时再次分配新变量。
之后,我们将声明一个StaticJsonBuffer类的对象,它对应于一个预先分配的内存池来存储JSON对象树。由于这是一个内存池,我们需要指定大小。这是在模板参数(下面的代码中<>之间的值)中完成的,以字节为单位。我们传递了一个300字节的值,这足以解析字符串:
StaticJsonBuffer<300> JSONBuffer; //内存池
接下来,我们在StaticJsonBuffer对象上调用parseObject方法,并将JSON字符串作为参数传递。此方法调用返回对类JsonObject的对象的引用,我们将使用它来获取已解析的值:
JsonObject& parsed = JSONBuffer.parseObject(JSONMessage); //解析消息
我们可以在JsonObject上调用success方法来确认解析发生时没有错误,如下所示:
if (!parsed.success()) { //检查解析中的错误
Serial.println("Parsing failed");
delay(5000);
return;
}
现在,我们将使用下标运算符从JsonObject获取其名称的解析值。换句话说,我们使用方括号和参数的名称来获取它们的值。请注意,要使用的字符串是原始JSON消息中的字符串:“SensorType”和“Value”:
const char * sensorType = parsed["SensorType"]; //获取传感器类型值
int value = parsed["Value"]; //获得传感器测量的值
下面可以看到打印这些值的最终代码:
#include "ArduinoJson.h"
void setup() {
Serial.begin(115200);
Serial.println();
}
void loop() {
Serial.println("Parsing start: ");
char JSONMessage[] = " {\"SensorType\": \"Temperature\", \"Value\": 10}"; //Original message
StaticJsonBuffer<300> JSONBuffer; //Memory pool
JsonObject& parsed = JSONBuffer.parseObject(JSONMessage); //Parse message
if (!parsed.success()) { //Check for errors in parsing
Serial.println("Parsing failed");
delay(5000);
return;
}
const char * sensorType = parsed["SensorType"]; //Get sensor type value
int value = parsed["Value"]; //Get value of sensor measurement
Serial.print("Sensor type: ");
Serial.println(sensorType);
Serial.print("Sensor value: ");
Serial.println(value);
Serial.println();
delay(5000);
}
测试结果
要测试结果,请将程序上传到ESP32并打开Arduino IDE串行监视器。您应该可以开始获得类似于图2的输出,该输出显示解析原始消息后获得的值。
图2 – ESP32上JSON解析程序的输出。