1.基础
JSON(JavaScript Object Notation) 是一种通用的轻量级数据交换文本格式。它很容易让人阅读和编写,也便于机器进行解析和生成。它使用JavaScript语法来存储和描述数据对象,但是JSON完全独立于JavaScript。JSON可适用于多种流行编程语言。这些特性使JSON成为理想的数据交换格式。
1.JSON重要概念:数据、对象、数组
2.JSON语法规则要点:
- 数据以“名”“值”对呈现
- 数据“名”和“值”之间由冒号分隔
- 大括号{}用于标注对象内容
- 中括号[]用于标注数组内容
- 逗号用于分隔数据、对象、数组
3.JSON数据: JSON数据名称需要放在双引号中 “JSON数据名”:JSON数据值
例如:
“Year”: 2016
“URL”:”www.taichi-maker.com”
4.JSON数据值:
- 数字(整数或浮点数)
- 字符串
- 逻辑值(true 或 false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
注意:一个JSON数据名称只能对应一个值。
JSON数字数据示例: "value" : 25
JSON字符串数据示例: "name" : "taichi-maker"
JSON逻辑值数据示例: "bool_value" : true
JSON数组数据示例:
"info": [
{
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
},
{
"year": 2020,
"month": 12,
"day": 30
}
]
JSON对象数据示例:
"info": {
"name" : "taichi-maker",
"website" : "www.taichi-maker.com"
}
含有多个数据的JSON对象示例:
{
"info": {
"name": "taichi-maker",
"website": "www.taichi-maker.com"
},
"date": {
"year": 2020,
"month": 12,
"day": 30
}
}
注意:对象不能直接存放对象,也不能直接存放数组。
总结:
(1)符号的含义:
:用于分隔数据的“名”和“值”
{} 标注对象内容
[]标注数组内容
,分隔数据、对象和数组
2.采用ESP32对JSON数据进行解析(重要)
size_t 为 unsigned int
#include <Arduino.h>
#include <ArduinoJson.h>
void setup() {
Serial.begin(115200);
Serial.println("");
// 重点1:DynamicJsonDocument对象
const size_t capacity = JSON_OBJECT_SIZE(2) + 30;
DynamicJsonDocument doc(capacity);
// 重点2:即将解析的json文件
String json = "{\"name\":\"taichi-maker\",\"number\":1}";
// 重点3:反序列化数据
deserializeJson(doc, json);
// 重点4:获取解析后的数据信息
String nameStr = doc["name"].as<String>();
int numberInt = doc["number"].as<int>();
// 通过串口监视器输出解析后的数据信息
Serial.print("nameStr = ");Serial.println(nameStr);
Serial.print("numberInt = ");Serial.println(numberInt);
}
void loop() {}
重点1:const size_t capacity = JSON_OBJECT_SIZE(2) + 30;
DynamicJsonDocument doc(capacity);
这里我们建立了DynamicJsonDocument对象,该对象名称为doc。在建立该对象时需要提供一个参数,也就是括号中的参数capacity。这个capacity参数的作用是告诉ESP32我们所建立的DynamicJsonDocument对象将要占用多大的内存空间。+30这些额外增加的数值是由于ArduinoJson库在解析信息时,需要额外的空间来复制JSON信息。
使用了JSON_OBJECT_SIZE(2)这条指令。其中指令括号中的2即代表对象包含有两个数据。
重点2:String json = "{\"name\":\"taichi-maker\",\"number\":1}";
这条语句的作用是建立字符串变量,改变里用于存储需要解析的JSON信息。“/”是格式要求
重点3:deserializeJson(doc, json);这部分语句的作用是使用deserializeJson来对JSON文件进行解析。
重点4:String nameStr = doc["name"].as();
int numberInt = doc["number"].as();
这两条语句用于获取解析后的JSON信息,其中doc["name"].as
将会返回“name”的值。这条语句中.as将会让“name”的值以字符串的形式返回。
参考:MQTT在线解析库 Assistant | ArduinoJson 6
3-4-4-2 ESP8266 JSON解析 – 太极创客 (taichi-maker.com)
示例:{"msg":"OFF"}
解析:
StaticJsonDocument<48> doc;
DeserializationError error = deserializeJson(doc, input);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return;
}
const char* msg = doc["msg"]; // "OFF"
示例2:
/*JSON数据解析*/
StaticJsonDocument<32> doc;
DeserializationError error = deserializeJson(doc, data);
if (error)
{
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
return;
}
int msg = doc["msg"]; // 1
Serial.print("msg = ");
Serial.println(msg);
/*根据JSON信息执行相应的动作*/
switch (msg)
{
case 1:
Serial.println("LED_on");
break;
case 2:
Serial.println("LED_off");
break;
default:
break;
}