基于ESP8266的JSON解析实例分析
2023-09-11 14:17:11 时间
什么是JSON?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。其简洁和层次结构清晰的特点使得 JSON 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。即常说的Key/Value 键/值对。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
eps8266的经典案例:
这里给出一个能在esp8266上能够解析的最简单的例子:
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
void printJson(cJSON * root)//以递归的方式打印json的最内层键值对
{
for(int i=0; i<cJSON_GetArraySize(root); i++) //遍历最外层json键值对
{
cJSON * item = cJSON_GetArrayItem(root, i);
if(cJSON_Object == item->type) //如果对应键的值仍为cJSON_Object就递归调用printJson
printJson(item);
else //值不为json对象就直接打印出键和值
{
printf("%s->", item->string);
//printf("%s\n", cJSON_Print(item));//内存泄漏
}
}
}
int main()
{
char * jsonStr = "{\"semantic\":{\"slots\":{\"name\":\"Charlin\"}}, \"rc\":0, \"operation\":\"CALL\", \"service\":\"telephone\", \"text\":\"打电话给Charlin\"}";
cJSON * root = NULL;
cJSON * item = NULL;//cjson对象
root = cJSON_Parse(jsonStr);
if (!root)
{
printf("Error before: [%s]\n",cJSON_GetErrorPtr());
}
else
{
printf("%s\n", "有格式的方式打印Json:");
printf("%s\n\n", cJSON_Print(root));//内存泄漏
printf("%s\n", "无格式方式打印json:");
printf("%s\n\n", cJSON_PrintUnformatted(root));//内存泄漏
printf("%s\n", "一步一步的获取name 键值对:");
printf("%s\n", "获取semantic下的cjson对象:");
item = cJSON_GetObjectItem(root, "semantic");//
printf("%s\n", cJSON_Print(item));//内存泄漏
printf("%s\n", "获取slots下的cjson对象");
item = cJSON_GetObjectItem(item, "slots");
printf("%s\n", cJSON_Print(item));//内存泄漏
printf("%s\n", "获取name下的cjson对象");
item = cJSON_GetObjectItem(item, "name");
printf("%s\n", cJSON_Print(item));//内存泄漏
printf("%s:", item->string); //看一下cjson对象的结构体中这两个成员的意思
printf("%s\n", item->valuestring);
printf("\n%s\n", "打印json所有最内层键值对:");
printJson(root);
}
if(root)
cJSON_Delete(root); // 释放内存
return 0;
}
这里只给出一个最简单的例子:
详情咨询:(https://zhuanlan.zhihu.com/p/53730181)
顺便做个广告,本团队承接ESP8266的方案业务,有需求的朋友欢饮咨询。
相关文章
- JavaScript图形实例:图形放大镜效果
- Visual Studio 2017 - Windows应用程序打包成exe文件(2)- Advanced Installer 关于Newtonsoft.Json,LINQ to JSON的一个小demo mysql循环插入数据、生成随机数及CONCAT函数 .NET记录-获取外网IP以及判断该IP是属于网通还是电信 Guid的生成和数据修整(去除空格和小写字符)
- 基于 Vue.js 之 iView UI 框架非工程化实践记要 使用 Newtonsoft.Json 操作 JSON 字符串 基于.net core实现项目自动编译、并生成nuget包 webpack + vue 在dev和production模式下的小小区别 这样入门asp.net core 之 静态文件 这样入门asp.net core,如何
- C#字符串数组排序 C#排序算法大全 C#字符串比较方法 一个.NET通用JSON解析/构建类的实现(c#) C#处理Json文件 asp.net使用Jquery+iframe传值问题
- json.net(Json.NET - Newtonsoft)利用动态类解析json字符串
- JSON入门之二:org.json的基本使用方法
- asp.net和Jquery中详细解析json数据格式!(有实例)
- apt-get 和 apt-cache 命令实例展示
- QT中Json的使用方法(类和json字符串相互转换的方法)
- 使用json-lib进行Java和JSON之间的转换【转载】
- metaq安装实例
- 《正则表达式经典实例(第2版)》——2.2 匹配不可打印字符
- 《精通Android 实例开发》——第1章,第1.12节苹果Mac环境下搭建Android平台
- 《验收测试驱动开发:ATDD实例详解》—第1章1.1节代客泊车
- 《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——2.2 列出SQL Server实例
- 《HTML5 开发实例大全》——1.11 实现右键菜单功能
- httpclient调用webservice接口的方法实例
- Linux多线程实例练习 - pthread_exit() 与 pthread_join()
- Vue3+elementplus搭建通用管理系统实例六:后台主页搭建下
- java线程安全问题之静态变量、实例变量、局部变量
- Nginx反向代理配置配置实例
- 使用QTP录制自带Flight小实例
- 三层实例--加入信息
- 策略模式,装饰模式 实例
- [Android Studio] Java onClickListener is abstract; cannot be instantiated(...是抽象的,无法实例化)的解决
- JSON和GSON操作json数据