一、什么是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 < array_size; i++) { cJSON *item = cJSON_GetArrayItem(array_val, i); if (item != NULL && cJSON_IsNumber(item)) { printf("item[%d]: %d\n", i, item->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就是一个不错的选择。