〇、参考文章
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
分三步走:
- 判断是否为json对象
- 解析对象
- 释放内存
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的使用比官方提供的接口要简单很多