在C語(yǔ)言中,我們經(jīng)常需要讀取傳遞過(guò)來(lái)的 JSON 格式數(shù)據(jù),但如果數(shù)據(jù)中存在嵌套結(jié)構(gòu)的話就會(huì)比較麻煩。下面我們就來(lái)介紹一下如何從 JSON 數(shù)據(jù)中取出嵌套數(shù)據(jù)。
#include#include #include "cJSON.h" int main() { char *json_str = "{\"name\": \"John\", \"age\": 25, \"address\": {\"city\": \"New York\", \"state\": \"NY\", \"zip\": 10001}}"; cJSON *root = cJSON_Parse(json_str); if (root == NULL) { printf("Error before: [%s]\n", cJSON_GetErrorPtr()); return 1; } cJSON *address = cJSON_GetObjectItemCaseSensitive(root, "address"); if (cJSON_IsObject(address)) { cJSON *city = cJSON_GetObjectItemCaseSensitive(address, "city"); if (cJSON_IsString(city) && (city->valuestring != NULL)) { printf("City: %s\n", city->valuestring); } cJSON *state = cJSON_GetObjectItemCaseSensitive(address, "state"); if (cJSON_IsString(state) && (state->valuestring != NULL)) { printf("State: %s\n", state->valuestring); } cJSON *zip = cJSON_GetObjectItemCaseSensitive(address, "zip"); if (cJSON_IsNumber(zip)) { printf("Zip code: %d\n", zip->valueint); } } cJSON_Delete(root); return 0; }
在上面的代碼中,我們使用了 CJSON 庫(kù)來(lái)解析 JSON 數(shù)據(jù),并從中提取出 address 中的嵌套數(shù)據(jù)。首先我們使用cJSON_Parse
函數(shù)將 JSON 字符串轉(zhuǎn)換為 cJSON 對(duì)象,然后使用cJSON_GetObjectItemCaseSensitive
函數(shù)和對(duì)應(yīng)的鍵名來(lái)取得 address 對(duì)象。
接著我們使用cJSON_GetObjectItemCaseSensitive
函數(shù)再次取得嵌套對(duì)象中的城市、州和郵編信息,并判斷其數(shù)據(jù)類(lèi)型是否正確。最后打印出取到的數(shù)據(jù)即可。
需要注意的是,在訪問(wèn)嵌套的 JSON 數(shù)據(jù)時(shí)需要逐級(jí)獲取,如果中間某一層數(shù)據(jù)類(lèi)型錯(cuò)誤或者不存在,都會(huì)導(dǎo)致程序崩潰。因此我們需要對(duì)每一層數(shù)據(jù)進(jìn)行類(lèi)型判斷,以保證程序的穩(wěn)定性。