由于在一些低配的单片机上面不能直接使用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;
}





GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐