C和JSON是兩種非常常用的編程語言,都有自己獨(dú)特的特點(diǎn)。有時(shí)候我們需要把JSON數(shù)組轉(zhuǎn)成字符串?dāng)?shù)組或者對象數(shù)組,在C語言中實(shí)現(xiàn)這個(gè)功能其實(shí)是非常簡單的。
void json_to_string_array(cJSON *json_array, char **str_array, int num) { cJSON *json_item = NULL; int i = 0; for(i = 0; i< num; i++) { json_item = cJSON_GetArrayItem(json_array, i); if(json_item == NULL) { *(str_array++) = ""; // 如果json_item為NULL,把字符串置空 } else { *(str_array++) = json_item->valuestring; // 把json字符串拷貝到字符串?dāng)?shù)組中 } } } void json_to_object_array(cJSON *json_array, SomeStruct **struct_array, int num) { cJSON *json_item = NULL; int i = 0; SomeStruct *tmp_struct = NULL; for(i = 0; i< num; i++) { json_item = cJSON_GetArrayItem(json_array, i); tmp_struct = (SomeStruct *)malloc(sizeof(SomeStruct)); // 根據(jù)結(jié)構(gòu)體類型分配內(nèi)存 if(tmp_struct == NULL) { printf("malloc error!\n"); return; } memset(tmp_struct, 0, sizeof(SomeStruct)); // 分配內(nèi)存后需要初始化 tmp_struct->field_one = cJSON_GetObjectItem(json_item, "field_one")->valueint; // 用json數(shù)據(jù)填充結(jié)構(gòu)體 strcpy(tmp_struct->field_two, cJSON_GetObjectItem(json_item, "field_two")->valuestring); *(struct_array++) = tmp_struct; // 把結(jié)構(gòu)體指針拷貝到結(jié)構(gòu)體數(shù)組中 } }
可以看到上面兩個(gè)函數(shù)非常簡短,而且非常容易理解。一個(gè)函數(shù)可以把JSON數(shù)組轉(zhuǎn)成字符串?dāng)?shù)組,另一個(gè)函數(shù)可以把JSON數(shù)組轉(zhuǎn)成結(jié)構(gòu)體數(shù)組。
雖然這段代碼非常簡單,但是要注意一點(diǎn),在使用完結(jié)構(gòu)體數(shù)組之后要把數(shù)組中的每個(gè)結(jié)構(gòu)體都手動(dòng)釋放掉。這里只是提醒一下小伙伴們注意這個(gè)問題,不然可能會(huì)導(dǎo)致內(nèi)存泄漏。