1. 程式人生 > >在8位微控制器上實現JSON資料的簡單解析(微控制器解析JSON)

在8位微控制器上實現JSON資料的簡單解析(微控制器解析JSON)

https://blog.csdn.net/PZ0605/article/details/56017141

由於在一些低配的微控制器上面不能直接使用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;
}