esp8266+SDK开发 json格式数据创建&解析

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。在前后台进行数据对接时,常常采用json。

JSON 语法规则

  •     对象表示为键值对 "键":<值>
  •     数据由逗号分隔    ,
  •     花括号保存对象    {}
  •     方括号保存数组    []

json在线解析 https://www.json.cn/

 

esp8266 SDK开发,有两种方式进行json数据格式的创建or解析
乐鑫官方提供了API函数进行json的操作;另一种方式是使用原生的C库进行json的创建与解析。个人推崇后者,比较简单粗暴。下面使用C库操作json格式,代码解析

 

代码分析

构造json树的结构
由ASCII字符组成,键值对中的"键"是用字符串表示,需要使用 \ 进行转义。行末的\表示换行
 

//构造json树的结构
#define        JSON_Tree_Format    " { \n "                                \
                                    " \"Shanghai\": \n "                \
                                    " { \n "                            \
                                        " \"temp\": \"%s\", \n "        \
                                        " \"humid\": \"%s\" \n "        \
                                    " }, \n "                            \
                                                                        \
                                    " \"Shenzhen\": \n "                \
                                    " { \n "                            \
                                        " \"temp\": \"%s\", \n "        \
                                        " \"humid\": %s \n "            \
                                    " }, \n "                            \
                                                                        \
                                    " \"result\": \"%s\" \n "            \
                                " } \n "

char A_JSON_Tree[256] = {0};    // 存放JSON树


创建json树

/******************************************************************************
 * FunctionName : Setup_JSON_Tree_JX
 * Description  : 创建json树
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void Setup_JSON_Tree_JX(void)
{

    // 赋值JSON树【赋值JSON_Tree_Format字符串中的格式字符】
    //--------------------------------------------------------------------------------------------
    sprintf(A_JSON_Tree, JSON_Tree_Format, "30C","30%RH","35C","50","Shenzhen is too hot!");

    os_printf("\r\n--------------------------------------\r\n");

    os_printf("%s",A_JSON_Tree);    // 串口打印JSON树

    os_printf("\r\n--------------------------------------\r\n");
}


解析json树

/******************************************************************************
 * FunctionName : Parse_JSON_Tree_JX
 * Description  : 解析json树
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void Parse_JSON_Tree_JX(void)
{
        os_printf("\r\n---------------------------------------\r\n");
    
        char A_JSONTree_Value[64] = {0};    // JSON数据缓存数组
    
        char * T_Pointer_Head = NULL;        // 临时指针
        char * T_Pointer_end = NULL;        // 临时指针
    
        u8 T_Value_Len = 0;                 // 【"值"】的长度
    
    
        // 【"Shanghai"】
        //………………………………………………………………………………………………………………
        T_Pointer_Head = strstr(A_JSON_Tree, "\"Shanghai\"");        // 【"Shanghai"】
        os_printf("Shanghai:\n");
    
    //    T_Pointer_Head = strstr(T_Pointer_Head, ":");                // 【:】
    //    T_Pointer_Head = strstr(T_Pointer_Head, "{");                // 【{】
        T_Pointer_Head = strstr(T_Pointer_Head, "\"temp\"");         // 【"temp"】
        T_Pointer_Head = strstr(T_Pointer_Head, ":");                // 【:】
        T_Pointer_Head = strstr(T_Pointer_Head, "\"") + 1;            // 【值的首指针】
        T_Pointer_end = strstr(T_Pointer_Head, "\"");                // 【"值"尾的"】
        T_Value_Len = T_Pointer_end - T_Pointer_Head;                    // 计算【值】的长度
        memcpy(A_JSONTree_Value, T_Pointer_Head, T_Value_Len);        // 获取【值】
        A_JSONTree_Value[T_Value_Len] = '\0';                            // 【值后添'\0'】
        os_printf("\t temp:%s\n",A_JSONTree_Value);
    
    
    //    T_Pointer_Head = strstr(T_Pointer_Head, ",");                // 【,】
    //    T_Pointer_Head = strstr(T_Pointer_Head, "\"");                // 【\"】
        T_Pointer_Head = strstr(T_Pointer_Head, "\"humid\"");        // 【"humid"】
        T_Pointer_Head = strstr(T_Pointer_Head, ":");                // 【:】
        T_Pointer_Head = strstr(T_Pointer_Head, "\"") + 1;            // 【值的首指针】
        T_Pointer_end = strstr(T_Pointer_Head, "\"");                // 【"值"尾的"】
        T_Value_Len = T_Pointer_end - T_Pointer_Head;                    // 计算【值】的长度
        memcpy(A_JSONTree_Value, T_Pointer_Head, T_Value_Len);        // 获取【值】
        A_JSONTree_Value[T_Value_Len] = '\0';                            // 【值后添'\0'】
        os_printf("\t humid:%s\n",A_JSONTree_Value);
    
        //    T_Pointer_Head = strstr(T_Pointer_Head, "}");            // 【}】
        //    T_Pointer_Head = strstr(T_Pointer_Head, ",");            // 【,】
        //………………………………………………………………………………………………………………
    
    
        // 【"Shenzhen"】
        //………………………………………………………………………………………………………………
        T_Pointer_Head = strstr(T_Pointer_Head, "\"Shenzhen\"");     // 【"Shenzhen"】
        os_printf("Shenzhen:\n");
    
    //    T_Pointer_Head = strstr(T_Pointer_Head, ":");                // 【:】
    //    T_Pointer_Head = strstr(T_Pointer_Head, "{");                // 【{】
        T_Pointer_Head = strstr(T_Pointer_Head, "\"temp\"");         // 【"temp"】
        T_Pointer_Head = strstr(T_Pointer_Head, ":");                // 【:】
        T_Pointer_Head = strstr(T_Pointer_Head, "\"") + 1;            // 【值的首指针】
        T_Pointer_end = strstr(T_Pointer_Head, "\"");                // 【"值"尾的"】
        T_Value_Len = T_Pointer_end - T_Pointer_Head;                    // 计算【值】的长度
        memcpy(A_JSONTree_Value, T_Pointer_Head, T_Value_Len);        // 获取【值】
        A_JSONTree_Value[T_Value_Len] = '\0';                            // 【值后添'\0'】
        os_printf("\t temp:%s\n",A_JSONTree_Value);
    
    
        //【注:"humid"键所对应的值是数字。数字同样是由ASSIC码表示,但是没有""】
        //……………………………………………………………………………………………………
    //    T_Pointer_Head = strstr(T_Pointer_Head, ",");                // 【,】
    //    T_Pointer_Head = strstr(T_Pointer_Head, "\"");                // 【\"】
        T_Pointer_Head = strstr(T_Pointer_Head, "\"humid\"");        // 【"humid"】
        T_Pointer_Head = strstr(T_Pointer_Head, ":");                // 【:】
    
        // 获取数字的首指针【数字为十进制形式,并且没有""】
        //-----------------------------------------------------
        while(*T_Pointer_Head < '0' || *T_Pointer_Head > '9')    // 排除不在【0~9】范围内的字符
            T_Pointer_Head ++ ;
    
        T_Pointer_end = T_Pointer_Head; // 设置数字尾指针初值
    
        // 获取数字的尾指针+1【数字为十进制形式,并且没有""】
        //-----------------------------------------------------
        while(*T_Pointer_end >= '0' && *T_Pointer_end <= '9')    // 计算在【0~9】范围内的字符
            T_Pointer_end ++ ;
    
        T_Value_Len = T_Pointer_end - T_Pointer_Head;                    // 计算【值(数字)】的长度
        memcpy(A_JSONTree_Value, T_Pointer_Head, T_Value_Len);        // 获取【值(数字)】
        A_JSONTree_Value[T_Value_Len] = '\0';                            // 【值后添'\0'】
        os_printf("\t humid:%s\n",A_JSONTree_Value);
    
    //    T_Pointer_Head = strstr(T_Pointer_Head, "}");                // 【}】
    //    T_Pointer_Head = strstr(T_Pointer_Head, ",");                // 【,】
        //………………………………………………………………………………………………………………
    
        // 【"result"】
        //………………………………………………………………………………………………………………
        T_Pointer_Head = strstr(T_Pointer_Head, "\"result\"");        // 【"result"】
        T_Pointer_Head = strstr(T_Pointer_Head, ":");                // 【:】
        T_Pointer_Head = strstr(T_Pointer_Head, "\"") + 1;            // 【值的首指针】
        T_Pointer_end = strstr(T_Pointer_Head, "\"");                // 【"值"尾的"】
        T_Value_Len = T_Pointer_end - T_Pointer_Head;                    // 计算【值】的长度
        memcpy(A_JSONTree_Value, T_Pointer_Head, T_Value_Len);        // 获取【值】
        A_JSONTree_Value[T_Value_Len] = '\0';                            // 【值后添'\0'】
        os_printf("result:%s\n",A_JSONTree_Value);
    
        T_Pointer_Head = strstr(T_Pointer_Head, "}");            // 【}】
        //………………………………………………………………………………………………………………
    
        os_printf("\r\n---------------------------------------\r\n");
    
        return ;

}


设置一个任务,进行json的创建和解析

/******************************************************************************
 * FunctionName : user_init
 * Description  : entry of user application, init user function here
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void vTaskMyJson( void *pvParameters )
{
    for(;;)
    {    
        os_printf("JSON_Tree_Format:\n%s", JSON_Tree_Format);    // 打印JSON树格式

        Setup_JSON_Tree_JX();        // 创建JSON树

        Parse_JSON_Tree_JX();        // 解析JSON树
        
        vTaskDelay(100);

        //vTaskDelete(NULL);
        
        return ;
    }
}

 

串口打印结果

全部评论

相关推荐

2024-12-16 10:44
北京邮电大学 Java
之前说过如果拿到美团offer就把这么多轮的面试经验全写出来先说一下本人的经历有9个部门约面,2次拒面,4次二面挂,1次hr面挂,2次一面挂9月初做完笔试,隔了一周,优选约面了,秋招第一面,面的很差,没有准备好,手撕sql没写出来,另一道手撕写的不太好,果不其然一面挂9.30金服约面,这次面试全是八股,此时我的八股水平相当一般,每次深挖都不会,手撕是合并两个升序链表,一面寄过完国庆回来半个月美团再没约面过了知道10.20左右,SaaS部门约面这下就开启了我的噩梦循环,一面面评很不错,二面面试官问了在滴滴实习的限流的底层原理,实习的时候就没太看懂,面试的时候答的不好,但是侥幸二面过了,hr面的时候面试官问对大厂的印象,直接胡说八道了,过了三天人才库月底又面一轮到家二面问了很多场景题,答的都不太好,面试官提醒才能理清思路,面完就挂了走完这一轮面试已经11月了,11月更是噩梦循环,3次二面挂,可能因为之前有终面挂的经历面评还不错首先是美团平台,这个印象不深,自我感觉答的还可以,面试官也聊的不错,最后挂了,给面试官发邮件问了,面试官说前面的人接了offer,没有hc了遂挂然后就是我最想去的部门和base,成都的到家做营销业务的,面试很顺利,二面面试官是我的老乡,面完又开始紧张等待结果,还是挂了最后是核心本地平台做对内的系统的,可能还不如手里的保底offer,最后也不太想去,但是还是面了,二面挂,想不通时间到了12月,我的心态也是出奇的好,这个时候又陆陆续续有两个部门约面,但是心态已经很疲惫了,加上业务也不好,直接拒面了,每次来来回回都是半个月,很耽误时间,上周目前这个部门约面,一开始说周五面试,后面面试官有事又改到这周一,最后因为主管要出差,直接约面的第二天就面试了,两轮面完,第二天就oc了,谈薪没a动,但是也收到了正式offer,感觉也还能接受,剩下等等阿里和邮储就差不多签了一些面试tips1.这几次面试挂都是3天人才库,我看网上有的是长时间没有操作回的,可以问问面试官,有时候会捞回去2.美团面试是我秋招面试里最爱问八股的,一定要好好准备,问的也不难3.美团大部分技术面都有手撕,有时候会让写sql,没准备过,遇到一次寄4.很神奇每次面试碰到问最近看什么书这个问题的都挂了,感觉问这种问题就是面试官已经对你不感兴趣但是还要凑时长5.面试一定要好好准备,面了13次面试每次都有新的不会的点,一面八股居多,也看面试官,场景题最好也准备准备,普通八股是基础,一些中间件的原理也得知道6.坚持一定有好结果
甜美的牛牛在写bug:下载美团外卖没绷住
点赞 评论 收藏
分享
2024-11-30 22:57
门头沟学院 golang
牛客533433175号:更可气的是我做完这些给我拒了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务