在 C 語言中,我們常常需要將 JSON 格式的數據反序列化成為 C 結構體中的成員變量,其中嵌套 JSON 是常見的情況。嵌套 JSON 通常是指 JSON 數據中包含一個或多個 JSON 對象或數組,而這些 JSON 對象或數組又包含其他 JSON 對象或數組。這種情況下,我們需要使用嵌套結構體來表示 JSON 數據。
// C 結構體的聲明 typedef struct { char *name; int age; // 嵌套結構體 struct Address { char *city; char *street; } address; // 嵌套數組 struct Score { int math; int english; } score[3]; } Person;
以上是一個 C 結構體的例子,其中包含了一個嵌套結構體和一個嵌套數組。接下來,我們需要編寫反序列化的代碼來將 JSON 數據映射到 C 結構體中:
// 解析 JSON 數據 Person p; cJSON *root = cJSON_Parse(json_str); strcpy(p.name, cJSON_GetObjectItem(root, "name")->valuestring); p.age = cJSON_GetObjectItem(root, "age")->valueint; strcpy(p.address.city, cJSON_GetObjectItem(cJSON_GetObjectItem(root, "address"), "city")->valuestring); strcpy(p.address.street, cJSON_GetObjectItem(cJSON_GetObjectItem(root, "address"), "street")->valuestring); int i; for (i = 0; i< 3; i++) { p.score[i].math = cJSON_GetObjectItem(cJSON_GetObjectItem(root, "score"), i)->math; p.score[i].english = cJSON_GetObjectItem(cJSON_GetObjectItem(root, "score"), i)->english; }
在以上代碼中,我們使用 cJSON 庫來解析 JSON 數據。通過 cJSON_GetObjectItem() 函數可以獲取 JSON 數據中指定鍵的值,再通過 strcpy() 函數將數據映射到結構體中。對于嵌套的 JSON 對象或數組,我們需要使用 cJSON_GetObjectItem() 函數嵌套調用。
需要注意的是,在定義結構體時,嵌套結構體和數組的聲明需要放在結構體內部,而不能在結構體外部使用 typedef 或其他方式聲明。
綜上所述,嵌套 JSON 反序列化是 C 語言中常見的需求,我們可以使用 cJSON 庫來完成解析,需要注意結構體內部嵌套結構體或數組的聲明方式。