一、cJSON 核心數據結構
cJSON 的所有操作都圍繞?cJSON
?結構體展開,它代表 JSON 中的一個節點(可以是對象、數組、字符串、數字等):
typedef struct cJSON
{struct cJSON *next, *prev; // 用于鏈表(數組/對象的子節點)struct cJSON *child; // 子節點(對象/數組的元素)int type; // 節點類型(見下方宏定義)char *valuestring; // 字符串值(type為字符串時有效)int valueint; // 整數值(type為數字時可用)double valuedouble; // 浮點值(type為數字時有效)char *string; // 鍵名(對象的鍵)
} cJSON;
節點類型宏定義(部分常用):
cJSON_False
:布爾值 falsecJSON_True
:布爾值 truecJSON_NULL
:nullcJSON_Number
:數字(整數 / 浮點數)cJSON_String
:字符串cJSON_Array
:數組cJSON_Object
:對象
二、解析 JSON 字符串(核心接口)
1. 解析整個 JSON 字符串
cJSON *cJSON_Parse(const char *value);
- 功能:將 JSON 字符串解析為 cJSON 結構體(根節點)。
- 參數:
value
?為 JSON 格式的字符串。 - 返回:成功返回根節點指針,失敗返回?
NULL
。
2. 獲取節點類型
int cJSON_GetType(const cJSON *item);
3. 從對象中獲取子節點(按鍵名)
cJSON *cJSON_GetObjectItem(const cJSON *object, const char *string);
- 功能:從 JSON 對象中根據鍵名獲取子節點。
- 參數:
object
?為對象節點,string
?為鍵名。 - 返回:找到的子節點指針,未找到返回?
NULL
。
4. 獲取數組長度
int cJSON_GetArraySize(const cJSON *array);
功能:獲取 JSON 數組的元素個數
5. 從數組中獲取元素(按索引)
cJSON *cJSON_GetArrayItem(const cJSON *array, int index);
- 功能:從數組中根據索引獲取元素。
- 參數:
array
?為數組節點,index
?為索引(從 0 開始)。
6. 釋放解析后的 cJSON 結構
void cJSON_Delete(cJSON *c);
- 功能:釋放整個 cJSON 鏈表(根節點及所有子節點),防止內存泄漏。
三、構建 JSON 字符串(核心接口)
1. 創建基礎類型節點
cJSON *cJSON_CreateNumber(double num); // 創建數字節點
cJSON *cJSON_CreateString(const char *string); // 創建字符串節點
cJSON *cJSON_CreateBool(cJSON_bool boolean); // 創建布爾節點
cJSON *cJSON_CreateNull(void); // 創建 null 節點
2. 創建數組和對象
cJSON *cJSON_CreateArray(void); // 創建空數組
cJSON *cJSON_CreateObject(void); // 創建空對象
3. 向數組添加元素
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
- 功能:將節點添加到數組末尾。
4. 向對象添加鍵值對
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
- 功能:向對象添加鍵為?
string
、值為?item
?的鍵值對。
5. 將 cJSON 結構轉為字符串
char *cJSON_Print(const cJSON *item); // 格式化輸出(帶縮進)
char *cJSON_PrintUnformatted(const cJSON *item); // 緊湊輸出(無縮進)
- 返回:動態分配的字符串,使用后需用?
free()
?釋放。
6. 將 cJSON出錯信息打印
printf("%s\n", ,cJSON_GetErrorPtr());
四、示例代碼:
#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h" // 需包含 cJSON 頭文件// 解析 JSON 示例
void parse_json_example(const char *json_str)
{// 1. 解析 JSON 字符串cJSON *root = cJSON_Parse(json_str);if (root == NULL) {printf("解析 JSON 失敗: %s\n", cJSON_GetErrorPtr());return;}// 2. 獲取 "success" 字段(字符串)cJSON *success = cJSON_GetObjectItem(root, "success");if (success && success->type == cJSON_String) {printf("請求狀態: %s\n", success->valuestring);}// 3. 獲取 "result" 對象cJSON *result = cJSON_GetObjectItem(root, "result");if (result && result->type == cJSON_Object) {// 4. 從 result 中獲取城市和溫度cJSON *city = cJSON_GetObjectItem(result, "city");cJSON *temp = cJSON_GetObjectItem(result, "temp");if (city && city->type == cJSON_String) {printf("城市: %s\n", city->valuestring);}if (temp && temp->type == cJSON_String) {printf("溫度: %s℃\n", temp->valuestring);}// 5. 解析 "index" 數組cJSON *index_array = cJSON_GetObjectItem(result, "index");if (index_array && index_array->type == cJSON_Array) {int size = cJSON_GetArraySize(index_array);printf("生活指數(共 %d 條):\n", size);for (int i = 0; i < size; i++) {cJSON *item = cJSON_GetArrayItem(index_array, i);if (item && item->type == cJSON_String) {printf(" - %s\n", item->valuestring);}}}}// 6. 釋放資源cJSON_Delete(root);
}// 構建 JSON 示例
void create_json_example()
{// 1. 創建根對象cJSON *root = cJSON_CreateObject();if (root == NULL) {printf("創建根對象失敗\n");return;}// 2. 向根對象添加字段cJSON_AddItemToObject(root, "name", cJSON_CreateString("天氣查詢"));cJSON_AddItemToObject(root, "version", cJSON_CreateNumber(1.0));cJSON_AddItemToObject(root, "enabled", cJSON_CreateBool(1)); // true// 3. 創建數組并添加元素cJSON *cities = cJSON_CreateArray();cJSON_AddItemToArray(cities, cJSON_CreateString("北京"));cJSON_AddItemToArray(cities, cJSON_CreateString("上海"));cJSON_AddItemToObject(root, "support_cities", cities);// 4. 轉為字符串并打印char *json_str = cJSON_Print(root); // 格式化輸出if (json_str) {printf("\n構建的 JSON:\n%s\n", json_str);free(json_str); // 釋放字符串}// 5. 釋放資源cJSON_Delete(root);
}int main()
{// 模擬 API 返回的 JSON 字符串const char *api_response = "{""\"success\":\"1\",""\"result\":{""\"city\":\"北京\",""\"temp\":\"25\",""\"weather\":\"晴\",""\"index\":[\"適宜出行\",\"注意防曬\"]""}""}";// 解析示例parse_json_example(api_response);// 構建示例create_json_example();return 0;
}