资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git
说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系!
说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。
说明3:学会以后,下面的代码可能会跟你一辈子!
说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程!
这节需要知道的知识点
https://www.cnblogs.com/yangfengwu/p/11685325.html
下载JSON文件:
链接: https://sourceforge.net/projects/cjson/
等到倒计时到0
拷贝JSON源文件和头文件,添加头文件到include.h
解析个数据
"{\"datemcu\":\"updata\",\"cmd\":\"model\"}"
JSON标准格式 {"字段","字段值"}
\" 意思是转义 " 就是说这个" 并不起什么作用,只是个"
如果不写 \ 那么会认为 "{" 就会和前面的" 配合了
char jsonValue1[50]="{\"datemcu\":\"updata\",\"cmd\":\"model\"}"; cJSON *jsonData,*jsonValue; int main(void) { NVIC_Configuration(); uart_init(115200); //串口初始化为115200 GpioInit(); DelayInit(); rbCreate(&Uart1rb,Usart1SendBuff,Usart1SendLen);//创建环形队列--串口1 jsonData = cJSON_Parse(jsonValue1);//把数据存储到cJSON链表中 if(jsonData)//是JSON数据 { jsonValue = cJSON_GetObjectItem(jsonData,"datemcu");//查找datemcu字段,如果存在则序列化cJSON结构体中 if(jsonValue->type == cJSON_String)//获取当前字段的数据类型 { printf("%s\r\n",jsonValue->valuestring);//打印相应字段的值 } jsonValue = cJSON_GetObjectItem(jsonData,"cmd");//查找cmd字段,如果存在则序列化cJSON结构体中 if(jsonValue->type == cJSON_String)//获取当前字段的数据类型 { printf("%s\r\n",jsonValue->valuestring);//打印相应字段的值 } } cJSON_Delete(jsonData);//释放内存
解析个二维的数据:
"{\"datemcu\":\"updata\",\"cmd\":{\"Id\":\"CH010100\",\"code\":\"001\"}}";
char jsonValue2[100]="{\"datemcu\":\"updata\",\"cmd\":{\"Id\":\"CH010100\",\"code\":\"001\"}}"; cJSON *jsonData,*jsonItem,*jsonValue; int main(void) { NVIC_Configuration(); uart_init(115200); //串口初始化为115200 GpioInit(); DelayInit(); rbCreate(&Uart1rb,Usart1SendBuff,Usart1SendLen);//创建环形队列--串口1 jsonData = cJSON_Parse(jsonValue2);//把数据存储到cJSON链表中 if(jsonData)//是JSON数据 { jsonValue = cJSON_GetObjectItem(jsonData,"datemcu");//查找datemcu字段,如果存在则序列化cJSON结构体中 if(jsonValue->type == cJSON_String)//获取当前字段的数据类型 { printf("%s\r\n",jsonValue->valuestring);//打印相应字段的值 } jsonItem = cJSON_GetObjectItem(jsonData,"cmd");//查找cmd字段,如果存在则序列化cJSON结构体中 if(jsonItem->type == cJSON_Object)//获取当前字段的数据类型,(一个JSON对象) { jsonValue = cJSON_GetObjectItem(jsonItem,"Id");//查找Id字段,如果存在则序列化cJSON结构体中 if(jsonValue->type == cJSON_String)//获取当前字段的数据类型 { printf("%s\r\n",jsonValue->valuestring);//打印相应字段的值 } jsonValue = cJSON_GetObjectItem(jsonItem,"code");//查找code字段,如果存在则序列化cJSON结构体中 if(jsonValue->type == cJSON_String)//获取当前字段的数据类型 { printf("%s\r\n",jsonValue->valuestring);//打印相应字段的值 } } } cJSON_Delete(jsonData);//释放内存
封装个数据:
{"datemcu":"updata","value":2}
封装个复杂点的数据:
更多操作看官方例子:
错误. 后来发现是malloc 内存不足导致的(cJSON 的数据全部用malloc 分配)