cJson實戰用途

    /************************************************* 
    * example json file 
    * name    file 
    *    { 
    *            "firstname":"lin", 
    *            "lastname":"spock", 
    *            "age":"25", 
    *            "address":{ 
    *                    "city": "New York", 
    *                    "country":"USA", 
    *                    "street":["11","22","33"] 
    *            }, 
    *            "hobbies":["basketball","football"], 
    *            "new":["new"] 
    *    } 
    *************************************************/  
      
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <stdint.h>  
    #include "cJSON.h"                                                   
      
    void Set(cJSON *root, char *str3, char *str4, char *str5, char *str6) {                                 /*json filename set fathercjson childcjson newvalue*/  
      
        if (strcmp(str3, "root") == 0) {                                                                    /*jsona file set root firstname chen*/  
            cJSON *tmp_json = cJSON_GetObjectItem(root, str4);  
            if (tmp_json != NULL) {  
                cJSON_ReplaceItemInObject(root, str4, cJSON_CreateString(str5));  
            } else {  
                fprintf(stderr, "%s元素不存在,請先添加\n", str4);  
                fprintf(stdout, "新增元素命令格式:程序 json文件名 add object|array 父元素 子元素 新值\n");  
                exit(0);  
            }  
        } else {  
            cJSON *tmp_json = cJSON_GetObjectItem(root, str3);  
            if (tmp_json != NULL) {  
                if (tmp_json->type == cJSON_Object) {                                                        /*json file set address city Beijing*/  
                    cJSON *obj_json = cJSON_GetObjectItem(tmp_json, str4);  
                    if (obj_json != NULL) {  
                        cJSON_ReplaceItemInObject(tmp_json, str4,  
                                cJSON_CreateString(str5));  
                    } else {  
                        fprintf(stderr, "%s元素不存在,請先創建\n", str4);  
                        exit(0);  
                    }  
      
                } else if (tmp_json->type == cJSON_Array) {                                                    /*json file set hobbies 1 readbook*/  
      
                    int count = cJSON_GetArraySize(tmp_json);  
                    if (atoi(str4) < (count + 1) && atoi(str4) > 0) {  
                        cJSON_ReplaceItemInArray(tmp_json, atoi(str4) - 1,  
                                cJSON_CreateString(str5));  
                    } else {  
                        fprintf(stderr, "該數組不存在第%s個元素,請重新輸入\n", str4);  
                        exit(0);  
                    }  
      
                }  
            } else {  
                fprintf(stderr, "%s元素不存在,請先添加\n", str3);  
                fprintf(stdout,  
                        "新增元素命令格式:程序 json文件名 add object|array 父元素 子元素 新值\n");  
                exit(0);  
            }  
        }  
    }  
      
    void Add(cJSON *root, char *str3, char *str4, char *str5, char *str6) {                                        /*json filename add object fathercjson childcjson addvlaue*/  
      
        if (strcmp(str3, "object") == 0) {  
      
            if (strcmp(str4, "root") == 0) {                                                                    /*jsona file add object root test test*/  
                cJSON *tmp_json = cJSON_GetObjectItem(root, str5);  
                if (tmp_json != NULL) {  
                    fprintf(stderr, "%s元素已存在,請先刪除\n", str5);  
                    fprintf(stdout, "刪除命令:程序 json文件名 delete 父元素 子元素\n");  
                    exit(0);  
                } else {  
                    cJSON_AddItemToObject(root, str5, cJSON_CreateString(str6));  
                }  
            } else {                                                                                            /*json file add object address planet eirth*/  
                cJSON *tmp_json = cJSON_GetObjectItem(root, str4);  
                if (tmp_json != NULL) {  
                    if (tmp_json->type == cJSON_Object) {  
      
                        cJSON *obj_json = cJSON_GetObjectItem(tmp_json, str5);  
                        if (obj_json != NULL) {  
                            fprintf(stderr, "%s元素已存在,請先刪除\n", str5);  
                            fprintf(stdout, "刪除命令:程序 json文件名 delete 父元素 子元素\n");  
                            exit(0);  
                        } else {  
                            cJSON_AddItemToObject(tmp_json, str5,  
                                    cJSON_CreateString(str6));  
                        }  
      
                    } else if (tmp_json->type == cJSON_Array) {  
                        cJSON *obj_json = cJSON_CreateObject();  
                        cJSON_AddItemToArray(tmp_json, obj_json);  
                        cJSON_AddStringToObject(obj_json, str5, str6);  
      
                    }  
                } else {  
                    fprintf(stderr, "%s元素不存在,請在上一級先添加%s\n", str4, str4);  
                    exit(0);  
                }  
      
            }  
      
        } else if (strcmp(str3, "array") == 0) {                                                                 /*json filename add array fathercjson childcjson addvalue*/  
      
            if (strcmp(str4, "root") == 0) {                                                                    /*jsona file add array root hobbies vallyball*/  
                cJSON *tmp_json = cJSON_GetObjectItem(root, str5);  
                if (tmp_json != NULL) {  
                    cJSON_AddItemToArray(tmp_json, cJSON_CreateString(str6));  
                } else {  
                    cJSON *tmp_json = cJSON_CreateArray();  
                    cJSON_AddItemToObject(root, str5, tmp_json);  
                    cJSON_AddItemToArray(tmp_json, cJSON_CreateString(str6));  
                }  
      
            } else {                              
                fprintf(stderr, "%s數組下尚不能添加二級數組或對象\n", str4);  
                exit(0);  
                /* 
                 cJSON *tmp_json = cJSON_GetObjectItem(root, str4); 
                 cJSON *arr_json = cJSON_GetObjectItem(tmp_json, str5); 
                 if (arr_json != NULL) { 
                 cJSON_AddItemToArray(arr_json, cJSON_CreateString(str6)); 
                 } else { 
                 cJSON *arr_json = cJSON_CreateArray(); 
                 cJSON_AddItemToObject(tmp_json, str5, arr_json); 
                 cJSON_AddItemToArray(arr_json, cJSON_CreateString(str6)); 
                 } 
                 */  
            }  
      
        } else {  
            fprintf(stderr, "第三個參數可選值爲: object|array,請重新輸入\n");  
            exit(0);  
        }  
      
    }  
      
    void Delete(cJSON *root, char *str3, char *str4) {                                                             /*json filename delete fathercjson childcjson*/  
      
        if (strcmp(str3, "root") == 0) {                                                                        /*/json file delete root firstname*/  
            cJSON *tmp_json = cJSON_GetObjectItem(root, str4);  
            if (tmp_json != NULL) {  
                cJSON_DeleteItemFromObject(root, str4);  
            } else {  
                fprintf(stderr, "%s元素不存在,請重新輸入\n", str4);  
                exit(0);  
            }  
      
        } else {  
            cJSON *tmp_json = cJSON_GetObjectItem(root, str3);  
            if (tmp_json != NULL) {                                                                                /*json file delete address city*/  
      
                if (tmp_json->type == cJSON_Object) {  
                    cJSON *obj_json = cJSON_GetObjectItem(tmp_json, str4);  
                    if (obj_json != NULL) {  
                        cJSON_DeleteItemFromObject(tmp_json, str4);  
                    } else {  
                        fprintf(stderr, "%s元素不存在,請重新輸入\n", str4);  
                        exit(0);  
                    }  
      
                } else if (tmp_json->type == cJSON_Array) {                                                     /*json file delete hobbies 2*/  
                    int count = cJSON_GetArraySize(tmp_json);  
      
                    if (atoi(str4) < (count + 1) && atoi(str4) > 0) {      
                        cJSON_DeleteItemFromArray(tmp_json, atoi(str4) - 1);  
                    } else {  
                        fprintf(stderr, "該數組不存在第%s個元素,請重新輸入\n", str4);  
                        (0);  
                    }  
                }  
            } else {  
                fprintf(stderr, "%s元素不存在,請重新輸入\n", str3);  
                exit(0);  
            }  
      
        }  
    }  
      
    int main(int argc, char *argv[]) {  
      
        FILE *fp = fopen(argv[1], "r");                                                                         /*從文件中讀取要解析的JSON數據*/  
      
        if (fp == NULL) {  
            fprintf(stderr, "第二個參數爲文件名,%s文件打開失敗\n");  
            exit(0);  
        }  
      
        fseek(fp, 0, SEEK_END);                                                                                 /*將指針指向文件末尾*/  
        long len = ftell(fp);                                                                                     /*ftell獲得當前指針位置相對於文件首的偏移字節數*/  
        fseek(fp, 0, SEEK_SET);                                                                                 /*再將指針指回開頭*/  
      
        char *data = (char*) malloc(len + 1);                                                                     /*分配內存*/  
        fread(data, 1, len, fp);                                                                                 /*printf("%s\n", data)*/  
        fclose(fp);  
      
        cJSON *root = cJSON_Parse(data);                                                                        /*將字符串解析成json結構體*/  
        char *ro = cJSON_Print(root);                                                                             /*可通過這個指針輸出內容測試*/  
        if (NULL == root) {  
            fprintf(stderr, "error:%s\n", cJSON_GetErrorPtr());  
            cJSON_Delete(root);  
        }  
      
        if (strcmp(argv[2], "set") == 0) {                                                                         /*改*/  
            if (argc != 6) {  
                fprintf(stderr, "參數過少或過多\n");  
                fprintf(stdout, "set命令參數有6個\n命令格式:程序 json文件名 set 父元素 子元素 新值\n");  
                exit(0);  
            }  
            Set(root, argv[3], argv[4], argv[5], argv[6]);  
      
        } else if (strcmp(argv[2], "add") == 0) {                                                                 /*增*/  
            if (argc != 7) {  
                fprintf(stderr, "參數過少或過多\n");  
                fprintf(stdout,"add命令參數有7個\n命令格式:程序 json文件名 add object|array 父元素 子元素 新值\n");  
                exit(0);  
            }  
            Add(root, argv[3], argv[4], argv[5], argv[6]);  
      
        } else if (strcmp(argv[2], "delete") == 0) {                                                             /*刪*/  
            if (argc != 5) {  
                fprintf(stderr, "參數過少或過多\n");  
                fprintf(stdout, "delete命令參數有五個\n命令格式:程序 json文件名 delete 父元素 子元素\n");  
                exit(0);  
            }  
            Delete(root, argv[3], argv[4]);  
      
        } else {  
            fprintf(stderr, "第三個參數錯誤\n"  
                    "第三個參數爲:set | add | delete\n");  
            fprintf(stdout, "具體命令格式爲:\n"  
                    "修改:程序 json文件名 set 父元素 子元素 新值\n"  
                    "添加:程序 json文件名 add object|array 父元素 子元素 新值\n"  
                    "刪除:程序 json文件名 delete 父元素 子元素\n"  
                    "當所要操作元素在最外層時父元素為\"root\"\n");  
            exit(0);  
        }  
      
        FILE *file;  
        file = fopen("file3", "wb");                                                                             /*將cjson寫入文件*/  
        char *out = cJSON_Print(root);  
        fprintf(file, "%s", out);  
        fclose(file);  
        free(out);  
      
        return 1;  
    }  

歡迎關注並加入物聯網行業聯盟,積累行業人脈和資源。


發佈了47 篇原創文章 · 獲贊 73 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章