Arduino学习笔记:JSON报文的解析与构建
背景:由于最近博主在忙于完成毕业设计,毕业设计用到了MQTT协议去传递消息,在消息的传递过程中呢,采用的是JSON报文的格式,因此在学习的过程中写下此篇建议的Demo,用于给更多萌新或者小白指明道路。
首先我们需要下载Arduino进行JSON解析需要的库文件,博主将库文件直接放到百度网盘中了,需要的可以下载,下载完成后放在自己的libraries库中即可。
链接:https://pan.baidu.com/s/1YvsHvjFvVrmrXI-lW7geJA?pwd=1234 提取码:1234
Arduino解析JSON
本项目中定义的JSON报文格式如下,包含了不仅简单的JSON格式:“Key”:“Value”;还包含了JSON数组和嵌套格式。该报文中的字符串内容可在JSON可视化网站上进行格式化。 JSON可视化网址:JSON可视化网站
{
"NameString": "ZhanSan",
"InfoArray": [
180,
70
],
"Birthday": {
"Year": 2000,
"Mother": 10,
"Day": {
"Hour": 12,
"Min": 45,
"Sec": 32.5
}
}
}
在该网站上能够对自己的JSON报文进行格式化并显示对应关系的视图,来检验层级关系是否正确。
在Arduino中使用的时候需要在该网址中进行删除空格并转义的操作得到如下报文。
我们将该段报文复制下来放在我们的Arduino代码中,得到如下字符串:
String JSON_Value ="{\"NameString\":\"ZhanSan\",\"InfoArray\":[180,70],\"Birthday\":{\"Year\":2000,\"Mother\":10,\"Day\":{\"Hour\":12,\"Min\":45,\"Sec\":32.5}}}";
从这段报文中我们能够看出,有字符串类型的数据,有数组类型的数据,有整型的数据还有浮点型的数据,嵌套层数也能够达到3级,其实只要是大于2级,解析的方式都是一样的,为了方便大家类比,在此我创建了3层。
下面给出源码:
#include <ArduinoJson.h>
DynamicJsonDocument JSON_Buffer(2*1024);
const char *Name = NULL;
int InfoOne = 0;
int InfoTwo = 0;
int Year = 0;
int Mother = 0;
int Hour = 0;
int Min = 0;
float Sec = 0.0;
JsonObject root;
void setup() {
Serial.begin(115200);
char JSON_Value[] ="{\"NameString\":\"ZhanSan\",\"InfoArray\":[180,70],\"Birthday\":{\"Year\":2000,\"Mother\":10,\"Day\":{\"Hour\":12,\"Min\":45,\"Sec\":32.5}}}";
Serial.println("====================Before================================");
Serial.println(JSON_Value);
DeserializationError error = deserializeJson(JSON_Buffer, JSON_Value);
if(error)
{
Serial.println("deserializeJson JSON_Buffer is ERROR!!!");
return ;
}
else
{
root = JSON_Buffer.as<JsonObject>();
Serial.println("====================After================================");
serializeJsonPretty(JSON_Buffer, Serial);
Name = JSON_Buffer["NameString"];
InfoOne = JSON_Buffer["InfoArray"][0];
InfoTwo = JSON_Buffer["InfoArray"][1];
Year = JSON_Buffer["Birthday"]["Year"];
Mother = JSON_Buffer["Birthday"]["Mother"];
Hour = JSON_Buffer["Birthday"]["Day"]["Hour"];
Sec = JSON_Buffer["Birthday"]["Day"]["Sec"];
Serial.println("================Start===========================");
Serial.println(Name);
Serial.println(InfoOne);
Serial.println(InfoTwo);
Serial.println(Year);
Serial.println(Hour);
Serial.println(Sec);
Serial.println("=================END==========================");
}
}
void loop() {
}
运行结果:
Arduino 构建JSON报文
上面我们完成了一个JSON字符串转换为JSON报文的格式再进行解析的过程,下面我们来构建一个完整的JSON报文。
源码部分:
#include <ArduinoJson.h>
DynamicJsonDocument JSON_Buffer(2*1024);
JsonArray InfoArray;
JsonObject BirthedayObj;
JsonObject DayObj;
void setup() {
Serial.begin(115200);
JSON_Buffer["NameString"] = "ZhangSan";
InfoArray = JSON_Buffer.createNestedArray("InfoArray");
InfoArray.add(180);
InfoArray.add(70);
JSON_Buffer["InfoArray"][0];
JSON_Buffer["InfoArray"][1];
BirthedayObj = JSON_Buffer.createNestedObject("Birthday");
JSON_Buffer["Birthday"]["Year"] = 2000;
JSON_Buffer["Birthday"]["Mother"] = 10;
JSON_Buffer["Birthday"]["Day"]["Hour"] = 12;
JSON_Buffer["Birthday"]["Day"]["Min"] = 45;
JSON_Buffer["Birthday"]["Day"]["Sec"] = 32.5;
serializeJsonPretty(JSON_Buffer, Serial);
}
void loop() {
}
运行结果:
|