0°

(六)ESP32:解析JSON

这篇文章的目的是解释如何使用ESP32和ArduinoJson库解析JSON消息。

这篇文章的目的是解释如何使用ESP32和ArduinoJson库解析JSON消息。

介绍

这篇文章的目的是解释如何使用ESP32和ArduinoJson库解析JSON消息。

请注意,此程序与教程中有关在ESP8266上解析JSON的代码非常相似。

您可以通过Arduino IDE库管理器安装库,这是最简单的方法。只需在搜索栏上搜索ArduinoJson,如图1所示,你就可以选择它了。在撰写本文时,最新版本是5.9.0,这是本教程使用的版本。

ESP32:解析JSON

图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的输出,该输出显示解析原始消息后获得的值。

ESP32:解析JSON

图2 – ESP32上JSON解析程序的输出。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论