18363890557 发表于 2020-9-21 10:09:28

14-单片机加入JSON是个不错的选择





这节需要知道的知识点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="{\"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="{\"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 分配)



页: [1]
查看完整版本: 14-单片机加入JSON是个不错的选择