在C語(yǔ)言開發(fā)中,有時(shí)候需要將JSON數(shù)據(jù)轉(zhuǎn)化為未知的類(structure)。這樣做是模擬對(duì)象,并可以操作數(shù)據(jù)更加靈活。下面就詳細(xì)介紹如何實(shí)現(xiàn)該功能。
//JSON數(shù)據(jù)結(jié)構(gòu) const char *json_str = { "name": "Tom", "age": 20, "scores": [60, 70, 80] }; //定義未知的類 typedef struct { char* name; int age; int scores[3]; } UnknownClass;
首先,需將JSON數(shù)據(jù)轉(zhuǎn)換為“鍵值對(duì)”(key-value)格式,用以存儲(chǔ)JSON數(shù)據(jù)。可以使用第三方庫(kù)cJSON,其為一個(gè)輕量且開放源代碼的C語(yǔ)言解析JSON數(shù)據(jù)格式的庫(kù)。它提供了一個(gè)API,非常容易使用。
//使用cJSON庫(kù)解析JSON數(shù)據(jù)結(jié)構(gòu),并將其轉(zhuǎn)化為“鍵值對(duì)”格式 cJSON *json = cJSON_Parse(json_str); cJSON *name = cJSON_GetObjectItem(json, "name"); cJSON *age = cJSON_GetObjectItem(json, "age"); cJSON *scores = cJSON_GetObjectItem(json, "scores"); //將“鍵值對(duì)”格式的數(shù)據(jù)存儲(chǔ)到未知類的實(shí)例中 UnknownClass uc; uc.name = name->valuestring; uc.age = age->valueint; if(cJSON_IsArray(scores) && cJSON_GetArraySize(scores) == 3) { cJSON* score = cJSON_GetArrayItem(scores, 0); uc.scores[0] = score->valueint; score = cJSON_GetArrayItem(scores, 1); uc.scores[1] = score->valueint; score = cJSON_GetArrayItem(scores, 2); uc.scores[2] = score->valueint; }
這里的cJSON_IsArray()函數(shù)判斷JSON數(shù)據(jù)中scores鍵是否為一個(gè)數(shù)組,cJSON_GetArraySize()函數(shù)獲取數(shù)組的元素?cái)?shù)量,cJSON_GetArrayItem()函數(shù)獲取數(shù)組中某個(gè)元素的值。
最終,我們可以通過(guò)操作(UnknownClass)uc來(lái)得到JSON數(shù)據(jù)中的所有信息。這樣就實(shí)現(xiàn)了將JSON數(shù)據(jù)轉(zhuǎn)換為未知類的功能。