cjson是一個用來解析JSON格式數據的C/C++語言庫,它可以將JSON格式的數據轉換成C/C++的數據類型,同時也可以將C/C++的數據類型轉換成JSON格式的數據。對于cjson,要想判斷JSON格式是否正確,我們需要使用一些API。
cJSON *cJSON_Parse(const char *json)
cJSON_Parse()函數是用來解析JSON格式數據的,它會返回一個cJSON對象,如果JSON格式不正確,它會返回NULL。
cJSON_bool cJSON_IsNumber(const cJSON *const object) cJSON_bool cJSON_IsString(const cJSON *const object) cJSON_bool cJSON_IsArray(const cJSON *const object) cJSON_bool cJSON_IsObject(const cJSON *const object)
這里介紹四個重要的函數,它們分別是cJSON_IsNumber()、cJSON_IsString()、cJSON_IsArray()和cJSON_IsObject()。它們的作用是判斷輸入的cJSON對象是否為數字、字符串、數組或對象。如果是,返回1;否則返回0。
int cJSON_GetArraySize(const cJSON *array)
該函數返回一個數組或者對象中元素的數量。如果不是數組或者對象,返回0。
cJSON *cJSON_GetArrayItem(const cJSON *array, int item)
cJSON_GetArrayItem()函數返回數組或者對象的第item個元素,如果不是數組或對象,或item越界,返回NULL。
結合使用這些API,我們可以編寫一段用于判斷JSON格式的代碼:
cJSON *root = cJSON_Parse(json_str);//解析json if(NULL == root) { printf("json parse fail:%s\n", cJSON_GetErrorPtr()); return -1; } if(!cJSON_IsObject(root)) { printf("json format error: root is not a json object\n"); cJSON_Delete(root);//釋放內存 return -1; } cJSON *array = cJSON_GetObjectItem(root, "array");//獲取數組元素 if(NULL == array) { printf("json format error: no array element\n"); cJSON_Delete(root);//釋放內存 return -1; } if(!cJSON_IsArray(array) || cJSON_GetArraySize(array)< 1)//判斷是否是數組&元素數量是否為0 { printf("json format error: array element is not an array or is empty\n"); cJSON_Delete(root);//釋放內存 return -1; } cJSON *item1 = cJSON_GetArrayItem(array, 0);//獲取第一個元素 if(NULL == item1) { printf("json format error: no array items\n"); cJSON_Delete(root);//釋放內存 return -1; } if(!cJSON_IsObject(item1))//判斷是否為對象 { printf("json format error: array items is not a json object\n"); cJSON_Delete(root);//釋放內存 return -1; } //其他判斷 cJSON_Delete(root);//釋放內存
以上代碼可以判斷JSON格式,包括是否為空、是否為對象、是否包含數組、數組是否為空,第一個元素是否為對象等等。這樣可以有效避免程序因解析格式錯誤而出現異常情況。