JSON数据解析

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;
  }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值