在 C 語(yǔ)言中,使用 JSON 格式來(lái)進(jìn)行序列化和反序列化是一種非常方便的方法。在反序列化 JSON 數(shù)據(jù)的時(shí)候,可能遇到一對(duì)多的情況,即一個(gè) JSON 對(duì)象中包含多個(gè)同種類型的數(shù)據(jù)。下面介紹一下如何在 C 中進(jìn)行 JSON 反序列化時(shí),處理一對(duì)多的數(shù)據(jù)。
// 假設(shè) JSON 數(shù)據(jù)如下: { "students": [ {"name": "Tom", "age": 18}, {"name": "Jerry", "age": 20}, {"name": "Leo", "age": 22} ] } // 對(duì)應(yīng)的 C 結(jié)構(gòu)體如下: typedef struct student { char name[20]; int age; } Student; typedef struct data { Student *students; int count; } Data;
上面的 JSON 數(shù)據(jù)中,包含一個(gè)名為“students”的數(shù)組,里面包含了三個(gè)學(xué)生的信息。為了方便處理這種一對(duì)多的情況,我們可以將這個(gè)數(shù)組轉(zhuǎn)換成一個(gè)結(jié)構(gòu)體數(shù)組,然后再將結(jié)構(gòu)體數(shù)組賦值給一個(gè)數(shù)據(jù)結(jié)構(gòu)體。最后,通過(guò)遍歷數(shù)據(jù)結(jié)構(gòu)體中的結(jié)構(gòu)體數(shù)組,就可以得到所有的學(xué)生信息。
// 使用 cJSON 庫(kù)進(jìn)行反序列化 cJSON *root = cJSON_Parse(jsonData); // 獲取數(shù)組節(jié)點(diǎn) cJSON *studentsNode = cJSON_GetObjectItem(root, "students"); // 獲取數(shù)組長(zhǎng)度 int count = cJSON_GetArraySize(studentsNode); // 分配內(nèi)存空間 Data data; data.students = (Student *)malloc(sizeof(Student) * count); data.count = count; // 遍歷數(shù)組節(jié)點(diǎn) for (int i = 0; i< count; i++) { cJSON *item = cJSON_GetArrayItem(studentsNode, i); cJSON *nameNode = cJSON_GetObjectItem(item, "name"); cJSON *ageNode = cJSON_GetObjectItem(item, "age"); strcpy(data.students[i].name, cJSON_GetStringValue(nameNode)); data.students[i].age = cJSON_GetNumberValue(ageNode); } // 釋放內(nèi)存空間 cJSON_Delete(root);
上面的代碼中,首先用 cJSON 庫(kù)進(jìn)行反序列化,然后通過(guò) cJSON_GetObjectItem 函數(shù)獲取數(shù)組節(jié)點(diǎn),再通過(guò) cJSON_GetArraySize 函數(shù)獲取數(shù)組長(zhǎng)度,分配內(nèi)存空間。接著,遍歷數(shù)組節(jié)點(diǎn),獲取每個(gè)學(xué)生的信息,將其賦值給結(jié)構(gòu)體數(shù)組。最后,通過(guò) cJSON_Delete 函數(shù)釋放內(nèi)存空間。
這樣,就可以方便地處理一對(duì)多的 JSON 數(shù)據(jù)了。