esp32之解析json

news2025/1/23 21:10:33

文章目录

  • 前言
  • 一、json的作用
  • 二、json结构
  • 三、esp32 json解析
    • 安装库
    • 解析
      • StaticJsonDocument
      • DynamicJsonDocument
  • 四、解析今天的北京天气
  • 总结


前言

在现代Web开发中,JSON(JavaScript Object Notation)已成为常用的数据传输格式。ESP32是一款功能强大的微控制器,支持通过WiFi和Bluetooth进行网络连接,因此在ESP32应用中使用JSON非常有用。本文将介绍json是什么,ESP32 Arduino中解析json


一、json的作用

我们首先打开下面的链接:北京天气
我们打开后会是下面这些东西:

{"message":"success感谢又拍云(upyun.com)提供CDN赞助","status":200,"date":"20230513","time":"2023-05-13 17:07:21","cityInfo":{"city":"北京市","citykey":"101010100","parent":"北京","updateTime":"14:46"},"data":{"shidu":"24%","pm25":8.0,"pm10":18.0,"quality":"优","wendu":"26","ganmao":"各类人群可自由活动","forecast":[{"date":"13","high":"高温 28℃","low":"低温 11℃","ymd":"2023-05-13","week":"星期六","sunrise":"05:01","sunset":"19:20","aqi":70,"fx":"西风","fl":"2级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"14","high":"高温 31℃","low":"低温 17℃","ymd":"2023-05-14","week":"星期日","sunrise":"05:00","sunset":"19:21","aqi":69,"fx":"东南风","fl":"2级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"15","high":"高温 34℃","low":"低温 23℃","ymd":"2023-05-15","week":"星期一","sunrise":"04:59","sunset":"19:22","aqi":74,"fx":"南风","fl":"3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"16","high":"高温 33℃","low":"低温 19℃","ymd":"2023-05-16","week":"星期二","sunrise":"04:58","sunset":"19:23","aqi":84,"fx":"南风","fl":"2级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},{"date":"17","high":"高温 28℃","low":"低温 15℃","ymd":"2023-05-17","week":"星期三","sunrise":"04:57","sunset":"19:24","aqi":77,"fx":"东风","fl":"2级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},{"date":"18","high":"高温 27℃","low":"低温 15℃","ymd":"2023-05-18","week":"星期四","sunrise":"04:56","sunset":"19:24","aqi":61,"fx":"东南风","fl":"2级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"19","high":"高温 26℃","low":"低温 14℃","ymd":"2023-05-19","week":"星期五","sunrise":"04:55","sunset":"19:25","aqi":69,"fx":"东南风","fl":"2级","type":"小雨","notice":"雨虽小,注意保暖别感冒"},{"date":"20","high":"高温 27℃","low":"低温 15℃","ymd":"2023-05-20","week":"星期六","sunrise":"04:55","sunset":"19:26","aqi":77,"fx":"西北风","fl":"3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"21","high":"高温 27℃","low":"低温 16℃","ymd":"2023-05-21","week":"星期日","sunrise":"04:54","sunset":"19:27","aqi":79,"fx":"西北风","fl":"3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"22","high":"高温 31℃","low":"低温 17℃","ymd":"2023-05-22","week":"星期一","sunrise":"04:53","sunset":"19:28","aqi":87,"fx":"西北风","fl":"3级","type":"晴","notice":"愿你拥有比阳光明媚的心情"},{"date":"23","high":"高温 28℃","low":"低温 17℃","ymd":"2023-05-23","week":"星期二","sunrise":"04:52","sunset":"19:29","aqi":56,"fx":"西北风","fl":"3级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"24","high":"高温 32℃","low":"低温 19℃","ymd":"2023-05-24","week":"星期三","sunrise":"04:52","sunset":"19:30","aqi":48,"fx":"东风","fl":"2级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"25","high":"高温 32℃","low":"低温 18℃","ymd":"2023-05-25","week":"星期四","sunrise":"04:51","sunset":"19:31","aqi":47,"fx":"东南风","fl":"2级","type":"阴","notice":"不要被阴云遮挡住好心情"},{"date":"26","high":"高温 29℃","low":"低温 17℃","ymd":"2023-05-26","week":"星期五","sunrise":"04:50","sunset":"19:31","aqi":79,"fx":"东风","fl":"2级","type":"多云","notice":"阴晴之间,谨防紫外线侵扰"},{"date":"27","high":"高温 28℃","low":"低温 16℃","ymd":"2023-05-27","week":"星期六","sunrise":"04:50","sunset":"19:32","aqi":60,"fx":"西北风","fl":"2级","type":"小雨","notice":"雨虽小,注意保暖别感冒"}],"yesterday":{"date":"12","high":"高温 26℃","low":"低温 13℃","ymd":"2023-05-12","week":"星期五","sunrise":"05:02","sunset":"19:19","aqi":40,"fx":"东风","fl":"2级","type":"小雨","notice":"雨虽小,注意保暖别感冒"}}}

这些就是json,当我们学习完json以后,我们就可以去请求这个链接获取json,然后解析获取天气啦。

二、json结构

把上面这些复制到json解析网站,我们会得到下面的东西:
在这里插入图片描述
大家也可以自己去解析你们现在的北京天气情况。

示例json

{
   "name": "John Doe",
   "age": 30,   
   "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "state": "CA",
      "zip": "12345"
   },
   "phone_numbers": [
      "555-555-1234",
      "555-555-5678"
   ]
}

它由键值对组成,用于表示对象和数组
该JSON结构表示一个名为"John Doe"的人的一些信息。该结构包含以下键值对:

“name”:表示人的姓名,值为字符串"John Doe"。
“age”:表示人的年龄,值为整数30。
“address”:表示人的地址信息,值为一个嵌套的JSON对象,其中包含了该人的街道地址、城市、州和邮政编码。
“phone_numbers”:表示人的电话号码,值为一个JSON数组,其中包含了多个电话号码。

json是不是很简单?

三、esp32 json解析

安装库

要在ESP32 Arduino中使用JSON,需要使用ArduinoJson库。您可以按照以下步骤在ESP32 Arduino环境中使用ArduinoJson库:

1、打开Arduino IDE,并选择您的ESP32开发板。
2、在菜单栏中选择**“Sketch” > “Include Library” > “Manage Libraries”。**
3、在搜索框中输入“ArduinoJson”,然后找到并安装**“ArduinoJson”库。
4、在您的ESP32 Arduino项目中包含
“ArduinoJson.h”**库头文件。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为我这里已经安装了,大家选择最新版安装即可食用

解析

我们要在arduino中解析json,首先需要创建一个文档文档的意义在于把从最外层除第一个大括号开始解析,后面我们取数据直接使用**[]**就可以了.

StaticJsonDocument

特点:编译时分配静态内存,后续不能改变。

创建StaticJsonDocument对象:

StaticJsonDocument<大小> doc;

类模板指定文档的大小,我们需要精确控制大小,要不然会解析失败。

解析json:
使用deserializeJson(doc,json)函数即可解析参数2内的json。

const char* json = "{\"name\":\"John Doe\",\"age\":30,\"city\":\"Anytown\"}";
DeserializationError error = deserializeJson(doc, json);

访问json数据:
最简便的方法:

//解析键值对:
String name = doc["name"];//中括号里面填键,他返回值
//解析json对象中的东西:
String city = doc["address"]["city"];

总得来说,我们只需要使用**[]**进行解析就可以了,不管嵌套多少都可以。

解析json数组:

DynamicJsonDocument

特点:动态申请doc,后续不需要可以删除。

创建对象:

DynamicJsonDocument doc(大小);

清除内存:
清理内存的意义:DynamicJsonDocument是动态的JSON容器,其存储在堆上。在使用完毕后,应该将其所占用的内存释放掉,以免浪费内存,因为堆内存是有限的。

clear(doc);

其他使用和StaticJsonDocument几乎无差别。

四、解析今天的北京天气

使用到的json:在上面的json示例中。

#include <ArduinoJson.h>

void experiment()
{
  const char *json = "{\"name\":\"John Doe\",\"age\":30,\"address\":{\"street\":\"123 Main St\",\"city\":\"Anytown\",\"state\":\"CA\",\"zip\":\"12345\"},\"phone_numbers\":[\"555-555-1234\",\"555-555-5678\"]}";

  DynamicJsonDocument doc(1000);

  deserializeJson(doc,json);

  Serial.printf("My Name:%s,My street:%s,My state:%s",doc["name"],doc["address"]["street"],doc["name"]["state"]);
  //解析数组
  for(int i = 0;i<2;i++)
  {
    Serial.printf("phone Number:%s",doc["phone_numbers"][i]);
  }

  doc.clear();
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  experiment();
}

void loop() {
  // put your main code here, to run repeatedly:

}

可能解析会出现乱码,但是不用管,只要有东西就可以,以后我们的项目是直接http请求,他就不会出现这种错误。

总结

ESP32是一种功能强大的开发板,可以轻松地连接各种传感器和外部设备,进行数据采集和控制。在ESP32上解析JSON数据是很常见的操作,因为JSON数据结构清晰、易于扩展和在各种不同平台上应用。以下是一般的步骤和工具,来解析JSON数据在ESP32上:

1、准备JSON库:ESP32开发板有多个可用的JSON解析库,例如ArduinoJSON、uJson、cJSON等,我们需选择一个合适的库来使用。此外,我们要确保库的版本与IDE所支持的兼容。
2、将JSON数据存储到ESP32的内存中:通常情况下,我们需要从网络或文件中获取JSON数据,然后将其存储在ESP32的内存中。我们可以使用内置的WiFi或Ethernet库从网络上下载JSON数据,或从SD卡或SPIFFS文件系统中读取JSON文件。
3、解析JSON数据:使用所选的JSON库来解析JSON数据。通常使用函数deserializeJson()将JSON数据解析为JSON对象,然后我们就可以按照名字或者数组索引来访问JSON数据对象中的属性或元素。
处理JSON数据:一旦得到JSON对象,我们可以将其转换为其他数据类型进行处理或存储。例如,我们可以将JSON对象中的数据转换为字符串,数字,float或者存储在数组中。
4、内存管理:在ESP32上解析大量JSON数据可能会消耗很多内存,因此,我们需要小心地管理内存以避免内存泄漏。例如,在使用ArduinoJSON库时,需要根据JSON数据的大小分配足够的内存。

总之,在ESP32上使用JSON是很方便和可行的,它可以帮助用户解析和处理不同来源的数据,并将其集成到您的项目中。使用适当的JSON库和正确的方法,我们可以轻松地解析和处理JSON数据,从而实现优秀的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty 爱好者必看!一文详解 ChannelHandler 家族,助你快速掌握 Netty 开发技巧!

1 Channel 接口的生命周期 Channel 定义了一组和 ChannelInboundHandler API 密切相关的简单但功能强大的状态模型 1.1 Channel 的状态 状 态描 述ChannelUnregisteredChannel 已经被创建&#xff0c;但还未注册到 EventLoopChannelRegisteredChannel 已经被注册到了 EventL…

Wealth 开源的账本响应式网站系统免费部署

演示网站&#xff1a; https://wealth.willin.wang 前置准备 首先需要注册一个 Github 账号&#xff0c;Fork 这个开源项目&#xff1a; https://github.com/willin/wealth &#xff08;欢迎 Star&#xff09; 然后使用 Github 账号分别注册 Vercel 和 Planetscale&#xf…

【Linux 】 ps命令详解,查看进程pid

文章目录 ps概述ps语法指定pid进行查看 ps概述 ps 命令是最常用的监控进程的命令&#xff0c;通过此命令可以查看系统中所有运行进程的详细信息。 ps 命令有多种不同的使用方法&#xff0c;这常常给初学者带来困惑。在各种 Linux 论坛上&#xff0c;询问 ps 命令语法的帖子屡…

双向链表--C语言实现数据结构

本期带大家一起用C语言实现双向链表&#x1f308;&#x1f308;&#x1f308; 文章目录 一、链表的概念&#x1f30e;二、链表中数据元素的构成&#x1f30e; &#x1f30d;三、链表的结构&#x1f30e; &#x1f30d; &#x1f30f;四、 双向带哨兵位循环链表的实现&#x1f3…

ROS2 中 使用奥比中光 Orbbec Astra Pro 深度相机

本文将以 Ubuntu 20.04 和 ROS2 foxy 环境为例&#xff0c;详细介绍如何在 ROS2 中使用奥比中光 Orbbec Astra Pro 深度相机。在这一篇文章中&#xff0c;你会学到如何创建工作空间&#xff0c;使用 usb_cam 功能包&#xff0c;编译安装使用 ros_astra_camera 等。 文章目录 1.…

年薪50万的程序员和一般的中学教师相比,被亲戚看不起

我是一名程序员&#xff0c;已经工作五年&#xff0c;年薪大概有50万左右。然后&#xff0c;亲戚家的孩子是博士生&#xff0c;在一所中学教书&#xff0c;自己一年的工资可以抵达五六年的薪资&#xff0c;不过还是被亲戚给鄙视了。 很多人都持有不同的观点。我自己是一名程序…

vue-事件修饰符+键盘事件

事件修饰符 1、prevent&#xff1a; 阻止默认事件&#xff08;或在方法中使用e.preventDefault()&#xff09; <a hrefhttps://blog.csdn.net/weixin_52993364?typeblog click.preventshowInfo>点我</a> 说明&#xff1a;这样点击后就不会发生地址的跳转 2、s…

Linux查找指令 时间查看

date 我们在windows中想要看一下时间&#xff0c;我们可以直接在显示器上看到&#xff0c;但是如果我们用的是linux远程登录软件我们像查看一下时间&#xff0c;我们应该怎么做&#xff1f; 我们直接输入date&#xff0c;我们就可以看到当前的时间&#xff0c;不过这个是系统按…

蚁群算法ACS处理旅行商问题TSP【Java实现】

1. 介绍 蚁群算法是一种群体智能算法&#xff0c;模拟了蚂蚁寻找食物时的行为&#xff0c;通过蚂蚁之间的信息交流和合作&#xff0c;最终实现全局最优解的寻找【是否找得到和迭代次数有关】。 蚁群算法的基本思想是将搜索空间看作一个由节点组成的图&#xff0c;每个节点代表…

Linux awk [-v] {print} 命令

AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 语法&#xff1a;语法&#xff1a;awk 条件1 {动作 1} 条件 2 {动作 2} … 文件名 awk是处理文本文件的语言&#xff0c;所以要传入文本数据供其处理&#xff08;文件逐行读入&#xff09;&#xff0c;…

合宙Air780e C-SDK开发

Air78e简介 AirXXXE系列模组&#xff0c;是合宙通信基于移芯EC618平台设计研发的新款4G Cat.1模组。 Air780e的资料点击这里打开。 Air78e开发板简介 一代 IPEX 天线连接器&#xff08;选配&#xff09;4G 弹簧天线一个下载/调试串口&#xff0c;两个通用串口IO 口默认电平…

电子电气架构——车辆电子电气架构的网络安全汇总

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本文主要分享关于车辆电子电气架构的网络安全常见隐患和对应现阶段解决办法。 背景信息 不知道是否还记得《速度与激情8》中黑客Cipher通过网络侵入车辆,…

PyTorch2.0向后兼容性和加速效果浅探

前言 在PyTorch2022开发者大会上&#xff0c;PyTorch团队发布了一个新特性——torch.compile&#xff0c;将PyTorch的性能推向了新的高度&#xff0c;称这个新版本为PyTorch2.0。torch.compile的引入不影响之前的功能&#xff0c;其是一个完全附加和可选的功能&#xff0c;因此…

Linux系统调用函数(300多个)

前言&#xff1a;这里只是给出中文描述&#xff0c;方便浏览熟悉&#xff0c;具体情况建议去具体环境&#xff08;Linux系统&#xff09;下执行 1&#xff09;man 2 systemcalls &#xff08;查看所有系统调用函数&#xff09;&#xff1b;2&#xff09;man 2 open &#xff08…

Codeforces Round 872 (Div. 2)

Problem - D2 - Codeforces 思路&#xff1a; 我们设good点到所有k点的距离和为dis。 假设good点不止一个&#xff0c;那么我们good点的dis应该都是相等的&#xff08;废话&#xff09;。设当前点u是good点&#xff0c;如果他往儿子v移动&#xff0c;儿子有w个点属于k&#…

Maven 项目模板学习

目录 Maven 项目模板 什么是 archetype&#xff1f; 使用项目模板 Maven 将询问原型的版本 创建的项目 创建 pom.xml Maven 项目文档 Maven 快照(SNAPSHOT) 什么是快照? 项目快照 vs 版本 app-ui 项目的 pom.xml 文件 Maven 快照(SNAPSHOT)的出现是因为为了如果pom有…

OpenPCDet系列 | 4.4 DataProcessor点云数据处理模块解析

文章目录 DataProcessor模块解析1. mask_points_and_boxes_outside_range2. shuffle_points3. transform_points_to_voxels DataProcessor模块解析 在对batch_data的处理中&#xff0c;经过了point_feature_encoder模块处理后&#xff0c;就轮到了进行data_processor处理。在d…

django路由(多应用配置)

一、配置全局路由 在应用下&#xff0c;定义视图函数views.py from django.http import HttpResponse from django.shortcuts import render# Create your views here.def get_order(request):return HttpResponse("orders应用下的路由") 在项目的urls路由配置中&…

Qt事件传递及相关的性能问题

在使用Qt时&#xff0c;我们都知道能通过mousePressEvent&#xff0c;eventFilter等虚函数的重写来处理事件&#xff0c;那么当我们向一个界面发送事件&#xff0c;控件和它的父控件之间的事件传递过程是什么样的呢&#xff1f; 本文将以下图所示界面为例&#xff0c;结合源码介…

【sentinel】热点规则详解及源码分析

何为热点&#xff1f;热点即经常访问的数据。很多时候我们希望统计某些热点数据中访问频次最高的Top K数据&#xff0c;并对其访问进行限制。 比如&#xff1a; 商品ID为参数&#xff0c;统计一段时间内最常购买的商品ID并进行限制用户ID为参数&#xff0c;针对一段时间内频繁…