ESP-12S学习(9)--cJson接口

〇、参考文章
  1. ESP8266学习笔记(8)——第三方库cJSON使用
  2. esp8266之cJSON解析

cJson比之官方的json解析要简单很多,它是第三方的库

调用的话直接将cJSON.h添加到工程目录的include下面,cJSON.c添加到user下面

一、生成json
void ICACHE_FLASH_ATTR my_cjson(void)
{
	cJSON *pRoot = cJSON_CreateObject();	// 根
	cJSON *student = cJSON_CreateObject();	// 一个json对象student
	cJSON *teacher= cJSON_CreateObject();	// 一个json对象teacher

	//新增一个字段name到student ,值是zhangsan
	cJSON_AddStringToObject(student ,"name","zhangsan");
	//新增一个字段age到student ,值是18
	cJSON_AddNumberToObject(student ,"age",18);

	cJSON_AddStringToObject(teacher,"name","lisi");
	cJSON_AddNumberToObject(teacher,"age",48);
	
	// 新增一个json对象到跟节点
	cJSON_AddItemToObject(pRoot ,"student",student);
	cJSON_AddItemToObject(pRoot, "teacher",teacher);

	//数组初始化
	int flag[2]={0,1};
	cJSON *pFLAG= cJSON_CreateIntArray(flag,2);
	cJSON_AddItemToObject(pRoot,"flag",pFLAG);

	char *s = cJSON_Print(pRoot);
	os_printf("\r\n creatJson : %s\r\n", s);

	//释放内存
	cJSON_free((void *) s);	// 这里面直接调用os_free释放内存也是可以的
	cJSON_Delete(pRoot);
}

//主函数调用
mycjson();

注意一点,有的cJSON版本是没有cJSON_free()函数的,这个时候直接调用os_free()

打印生成的结果
在这里插入图片描述
具体的函数有什么作用参考上面代码就OK
在这里插入图片描述


二、解析json

分三步走:

  1. 判断是否为json对象
  2. 解析对象
  3. 释放内存
void ICACHE_FLASH_ATTR Json_parse(char *receiveData)
{
	// receiveData是接收到的数据
	//首先整体判断是否为一个json格式的数据
	cJSON *pJsonRoot = cJSON_Parse(receiveData);
	//如果是json格式数据
	if (pJsonRoot !=NULL)
	{
		// 解析数组
		cJSON *pFlag = cJSON_GetObjectItem(pJsonRoot, "flag");        // 解析flag键对应值数组内容
		if (!pFlag) return;                                          // 判断flag字段是否json格式
		else
		{
		    int arryLength = cJSON_GetArraySize(pFlag);              // 获取数组长度
		    int i;
		    for (i = 0; i < arryLength; i++)
		    {                                                        // 打印数组内容
		        os_printf("cJSON_GetArrayItem(pFlag, %d)= %d\n",i,cJSON_GetArrayItem(pFlag, i)->valueint);        
		    }
		}
	
		// 解析字符串
		char strName[23] = {0};
		cJSON *pStudent = cJSON_GetObjectItem(pJsonRoot, "student");      // 解析student字段内容
		if (!pStudent) return;                                          // 判断student字段是否json格式
		else
		{
		    cJSON *pName = cJSON_GetObjectItem(pStudent, "name");         // 解析子节点pStudent的name字段字符串内容
		    if (!pName) return;                                        // 判断name字段是否json格式
		    else
		    {
		        if (cJSON_IsString(pName))                             // 判断name字段是否string类型
		        {
		            strcpy(strName, pName->valuestring);                // 拷贝内容到字符串数组
		        }
		    }
		}
	
		// 解析对象数组
	/*	cJSON *pArryInfo = cJSON_GetObjectItem(pJsonRoot, "info");   // 解析info字段数组内容
		cJSON *pInfoItem = NULL;
		cJSON *pInfoObj = NULL;
		char strRelay[23] = {0};
		if (!pArryInfo) return;                                      // 判断info字段是否json格式
		else
		{
		    int arryLength = cJSON_GetArraySize(pArryInfo);          // 获取数组长度
		    int i;
		    for (i = 0; i < arryLength; i++)
		    {
		        pInfoItem = cJSON_GetArrayItem(pArryInfo, i);        // 获取数组中JSON对象
		        if(NULL != pInfoItem)
		        {
		            pInfoObj = cJSON_GetObjectItem(pInfoItem,"relay");// 解析relay字段字符串内容   
		            if(pInfoObj)
		            {
		                strcpy(strRelay, pInfoObj->valuestring);      // 拷贝内容到字符串数组
		            }
		        }                                                   
		    }
		}*/
	}
}

解析的结果如下:
在这里插入图片描述


总的来说,cJSON的使用比官方提供的接口要简单很多


2020.6.19
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值