论武天地论坛

 找回密码
 立即注册
搜索
查看: 16648|回复: 0

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

[复制链接]

58

主题

58

帖子

244

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
244
发表于 2020-9-21 10:09:28 | 显示全部楼层 |阅读模式




这节需要知道的知识点

下载JSON文件:
819239-20191016003321157-866588880.png




等到倒计时到0
819239-20191016003757967-2085076118.png




819239-20191016003921009-1675125719.png



拷贝JSON源文件和头文件,添加头文件到include.h
819239-20191016004205259-2116642094.png




819239-20191016012225308-1739520655.png





解析个数据
"{\"datemcu\":\"updata\",\"cmd\":\"model\"}"   


JSON标准格式  {"字段","字段值"}      
\"  意思是转义 "    就是说这个" 并不起什么作用,只是个"
如果不写   那么会认为  "{"   就会和前面的" 配合了

819239-20191016095942214-664878853.png



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);//释放内存

819239-20191016012125694-2114926007.png

解析个二维的数据:
"{\"datemcu\":\"updata\",\"cmd\":{\"Id\":\"CH010100\",\"code\":\"001\"}}";

819239-20191016102522538-1278372824.png


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);//释放内存


819239-20191016103352006-893547828.png




封装个数据:
{"datemcu":"updata","value":2}

819239-20191016104812256-1081828438.png



819239-20191016104837736-463146684.png



封装个复杂点的数据:
更多操作看官方例子:
819239-20191016111821262-769287546.png


819239-20191016111750495-527276046.png


错误. 后来发现是malloc 内存不足导致的(cJSON 的数据全部用malloc 分配)
819239-20191016111836303-1462680918.png


819239-20191016135215173-1531340648.png

819239-20191016135228311-153291122.png

copycode.gif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|论武天地论坛

GMT+8, 2024-11-25 21:40 , Processed in 0.079681 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表