在8位单片机上实现JSON数据的简单解析(单片机解析JSON)

来源:互联网 发布:风暴英雄有mac版吗 编辑:程序博客网 时间:2024/05/18 03:00


由于在一些低配的单片机上面不能直接使用C提供的系统库,项目中又需要解析服务器返回的JSON数据,以下代码可以简单的解析出JSON数据中的key:



////  main.c//  Test///***************************************          一些系统函数的简单实现  ***************************************/int my_strlen(char *string){    int len = 0;    while (*string != '\0') {        string++;        len++;    }    return len;}const char *my_strstr(const char *str, const char *sub_str){    for(int i = 0; str[i] != '\0'; i++)    {        int tem = i; //tem保留主串中的起始判断下标位置        int j = 0;        while(str[i++] == sub_str[j++])        {            if(sub_str[j] == '\0')            {                return &str[tem];            }        }        i = tem;    }        return "";}char* my_strncpy(char* dest, const char* src, int len){        char* temp=dest;    int i=0;    while(i++ < len  && (*temp++ = *src++)!='\0')    {            }    if(*(temp)!='\0')     *temp='\0';    return dest;    }int my_strcmp(char* str1, char* str2){   while(*str1 && *str2 && *str1==*str2)   {    ++str1;     ++str2;   }   return *str1-*str2;}/***************************************            JSON相关函数声明 ***************************************/char json_check(char *str); //JSON 校验函数char json_get_value(char *json,char *json_key , char *json_value); //JSON获取键值char json_check_value(char *str1, char *str2); //JSON 键值对比函数/*************************************** name:       JSON 校验函数 input:      字符串 output:     合法JAON 返回1 不合法JSON 返回0 description: ***************************************/char json_check(char *str){    char str_length; //定义字符长度变量    str_length = my_strlen(str); //计算字符长度    if(str[0] == '{' && str[str_length-1] == '}') //通过首尾大括号判断是否为JSON    {        return 1; //如果字符串为合法JSON 返回1    }    else    {        return 0; //如果字符串为合法JSON 返回0    }}/*************************************** name:       JSON 获取键值函数 input:      JSON字符串 要获取的键名 获取键值的字符串 output:     如果获取成功返回1 获取失败返回0 description: ***************************************/char json_get_value(char *json,char *json_key , char *json_value){        char *json_key_start; //定义键名开始的位置    char *json_key_end; //定义键名结束的位置    char json_key_length; //定义键名长度        char *json_value_start; //定义键值开始的位置    char *json_value_end; //定义键值结束的位置    char json_value_length; //定义键值长度        json_key_start = my_strstr(json,json_key); //获取键名开始的位置    json_key_length = my_strlen(json_key); //获取键名的长度            json_key_end = json_key_start + json_key_length;  //获取键名结束的位置            if(json_key_start != 0 && *(json_key_start - 1) == '\"' && *(json_key_end) == '\"' && *(json_key_end + 1) == ':' && *(json_key_end + 2) == '\"' )            {        json_value_start = json_key_end + 3; //获取键值开始的位置        json_value_end = my_strstr(json_value_start,"\""); //获取键值结束的位置        json_value_length = json_value_end - json_value_start; //获取键值的长度                my_strncpy(json_value,json_value_start,json_value_length); //将键值存入指针数组                json_value[json_value_length] = '\0'; //指针最后一位补字符串结束符 \0                return 1; //成功获取键值 返回1    }    else    {        json_value[0] = '\0';        return 0; //失败获取键值 返回0    }}/*************************************** name:       JSON 键值对比函数 input:      JSON 键值 要匹配的字符 output:     如果匹配成功返回1 失败返回0 description: ***************************************/char json_check_value(char *str1, char *str2){    if(my_strcmp(str1,str2) == 0)    {        return 1; //匹配成功返回1    }    else    {        return 0;//匹配成功返回0    }}/***************************************             测试方法  ***************************************/int main(int argc, const char * argv[]) {            //    char *json = "{\"test_key\":\"value1\"}";//    char rs = json_check(json);//    if(rs == 1){//        printf("json is valid....\r\n");//    }else{//        printf("json is invalid....\r\n");//    }//    //    unsigned char value[20];//    rs =  json_get_value(json,"test_key",&value);//    if(rs == 1){//        printf("parser test_key success....%s  \r\n",value);//    }else{//        printf("parser test_key fail....\r\n");//    }                char *json = "{\"activecode\":\"phonedirect\",\"uuid\":\"058daba0-f32c-11e6-9055-01160c7a67b1\",\"token\":\"5650ea47fc15d1c19132152681714094fd82fd3d\"}";    char rs = json_check(json);    if(rs == 1){       printf("json is valid....\r\n");    }else{        printf("json is invalid....\r\n");    }        unsigned char value[127];    rs =  json_get_value(json,"token",&value);    if(rs == 1){        printf("parser token success....%s  \r\n",value);    }else{        printf("parser token fail....\r\n");    }        rs =  json_get_value(json,"uuid",&value);    if(rs == 1){        printf("parser uuid success....%s  \r\n",value);    }else{        printf("parser uuid fail....\r\n");    }            //    {//        "key1": "value1",//        "key2": {//            "key3": "value3"//        }//    }    //    char *json = "\"{\"key1\":\"value1\",\"key2\":{\"key3\":\"value3\"}}";//    char rs = json_check(json);//    if(rs == 1){//        printf("json is valid....\r\n");//    }else{//        printf("json is invalid....\r\n");//    }////    unsigned char value[127];//    rs =  json_get_value(json,"key1",&value);//    if(rs == 1){//        printf("parser key1 success....%s  \r\n",value);//    }else{//        printf("parser key1 fail....\r\n");//    }//    //    rs =  json_get_value(json,"key2",&value);//    if(rs == 1){//        printf("parser key2 success....%s  \r\n",value);//    }else{//        printf("parser key2 fail....\r\n");//    }//    //    rs =  json_get_value(json,"key3",&value);//    if(rs == 1){//        printf("parser key3 success....%s  \r\n",value);//    }else{//        printf("parser key3 fail....\r\n");//    }    return 0;}



0 0
原创粉丝点击