一、什麼是JSON
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,具有可讀性高,易於數據傳輸和解析的特點,因此被廣泛應用於數據的傳輸和存儲中。
JSON的基本數據類型包括數字、字符串、布爾值、數組、對象和null。例如,下面是一個包含三個學生信息的JSON數據:
{ "students": [ { "name": "Tom", "age": 18, "gender": "male" }, { "name": "Lucy", "age": 19, "gender": "female" }, { "name": "Jack", "age": 20, "gender": "male" } ] }
二、CJSON簡介
CJSON是一個輕量級的JSON解析庫,其特點是佔用內存小、解析速度快、易於使用。CJSON只有兩個API,一個用於解析JSON數據,一個用於生成JSON數據。
CJSON的使用非常簡單,只需要包含cJSON.h頭文件即可。下面是一個簡單的示例:
#include #include "cJSON.h" int main() { char *json_str = "{ \"name\": \"Tom\", \"age\": 18, \"gender\": \"male\" }"; cJSON *root = cJSON_Parse(json_str); if (root != NULL) { cJSON *name = cJSON_GetObjectItem(root, "name"); if (name != NULL) { printf("name: %s\n", name->valuestring); } cJSON_Delete(root); } return 0; }
三、CJSON解析JSON數據的技巧
1. 解析基本數據類型
解析JSON數據的基本數據類型包括數字、字符串、布爾值和null。下面是一個示例:
#include #include "cJSON.h" int main() { char *json_str = "{ \"int\": 1, \"float\": 2.3, \"string\": \"hello\", \"bool_true\": true, \"bool_false\": false, \"null\": null }"; cJSON *root = cJSON_Parse(json_str); if (root != NULL) { cJSON *int_val = cJSON_GetObjectItem(root, "int"); if (int_val != NULL && cJSON_IsNumber(int_val)) { printf("int_val: %d\n", int_val->valueint); } cJSON *float_val = cJSON_GetObjectItem(root, "float"); if (float_val != NULL && cJSON_IsNumber(float_val)) { printf("float_val: %f\n", float_val->valuedouble); } cJSON *string_val = cJSON_GetObjectItem(root, "string"); if (string_val != NULL && cJSON_IsString(string_val)) { printf("string_val: %s\n", string_val->valuestring); } cJSON *bool_true_val = cJSON_GetObjectItem(root, "bool_true"); if (bool_true_val != NULL && cJSON_IsTrue(bool_true_val)) { printf("bool_true_val: true\n"); } cJSON *bool_false_val = cJSON_GetObjectItem(root, "bool_false"); if (bool_false_val != NULL && cJSON_IsFalse(bool_false_val)) { printf("bool_false_val: false\n"); } cJSON *null_val = cJSON_GetObjectItem(root, "null"); if (null_val != NULL && cJSON_IsNull(null_val)) { printf("null_val: null\n"); } cJSON_Delete(root); } return 0; }
2. 解析數組
解析JSON數據中的數組,可以使用cJSON_GetArrayItem和cJSON_GetArraySize兩個API。下面是一個示例:
#include #include "cJSON.h" int main() { char *json_str = "{ \"array\": [1, 2, 3] }"; cJSON *root = cJSON_Parse(json_str); if (root != NULL) { cJSON *array_val = cJSON_GetObjectItem(root, "array"); if (array_val != NULL && cJSON_IsArray(array_val)) { int array_size = cJSON_GetArraySize(array_val); printf("array_size: %d\n", array_size); for (int i = 0; i valueint); } } } cJSON_Delete(root); } return 0; }
3. 解析對象
解析JSON數據中的對象,可以使用cJSON_GetObjectItem和cJSON_GetArraySize兩個API。下面是一個示例:
#include #include "cJSON.h" int main() { char *json_str = "{ \"obj\": { \"name\": \"Tom\", \"age\": 18, \"gender\": \"male\" } }"; cJSON *root = cJSON_Parse(json_str); if (root != NULL) { cJSON *obj_val = cJSON_GetObjectItem(root, "obj"); if (obj_val != NULL && cJSON_IsObject(obj_val)) { cJSON *name = cJSON_GetObjectItem(obj_val, "name"); if (name != NULL && cJSON_IsString(name)) { printf("name: %s\n", name->valuestring); } cJSON *age = cJSON_GetObjectItem(obj_val, "age"); if (age != NULL && cJSON_IsNumber(age)) { printf("age: %d\n", age->valueint); } cJSON *gender = cJSON_GetObjectItem(obj_val, "gender"); if (gender != NULL && cJSON_IsString(gender)) { printf("gender: %s\n", gender->valuestring); } } cJSON_Delete(root); } return 0; }
四、總結
CJSON是一個非常輕量級的JSON解析庫,使用簡單,佔用內存小,解析速度快。在實際開發中,我們經常需要解析JSON格式的數據,這時候CJSON就是一個不錯的選擇。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/198485.html