在日常開發(fā)中,我們經(jīng)常會遇到需要將復(fù)雜的 JSON 數(shù)據(jù)轉(zhuǎn)換為特定格式的需求。這時(shí)候,我們可以使用 C 語言的 JSON 庫進(jìn)行處理。但是,對于復(fù)雜的 JSON 數(shù)據(jù)結(jié)構(gòu),我們的代碼也需要相應(yīng)地處理才能完成轉(zhuǎn)換。
// 示例 JSON 數(shù)據(jù) { "name": "小明", "age": 18, "score": { "math": 80, "english": 90 }, "hobbies": [ "reading", "running", "swimming" ] }
首先,我們需要定義一個(gè)結(jié)構(gòu)體來存儲 JSON 數(shù)據(jù)。針對上面的示例數(shù)據(jù),我們可以定義以下結(jié)構(gòu)體:
// 定義結(jié)構(gòu)體 typedef struct { char *name; int age; int math_score; int english_score; char *hobbies[3]; } Person;
接著,我們可以使用 C 語言的標(biāo)準(zhǔn)庫中的json-c
庫來解析 JSON 數(shù)據(jù)。
// 解析 JSON 數(shù)據(jù) json_object *person_obj = json_tokener_parse(json_str); json_object *name_obj = json_object_object_get(person_obj, "name"); json_object *age_obj = json_object_object_get(person_obj, "age"); json_object *score_obj = json_object_object_get(person_obj, "score"); json_object *math_obj = json_object_object_get(score_obj, "math"); json_object *english_obj = json_object_object_get(score_obj, "english"); json_object *hobbies_obj = json_object_object_get(person_obj, "hobbies"); // 獲取解析后的數(shù)據(jù) char *name = json_object_get_string(name_obj); int age = json_object_get_int(age_obj); int math_score = json_object_get_int(math_obj); int english_score = json_object_get_int(english_obj); const char *hobbies_str[3]; int hobbies_len = json_object_array_length(hobbies_obj); for (int i = 0; i< hobbies_len; i++) { hobbies_str[i] = json_object_get_string(json_object_array_get_idx(hobbies_obj, i)); } // 轉(zhuǎn)換為定義的結(jié)構(gòu)體 Person person = { .name = name, .age = age, .math_score = math_score, .english_score = english_score }; for (int i = 0; i< 3; i++) { person.hobbies[i] = (char *)hobbies_str[i]; }
通過以上代碼,我們就可以將 JSON 數(shù)據(jù)解析并轉(zhuǎn)換為自定義的結(jié)構(gòu)體。
當(dāng)然,如果遇到更加復(fù)雜的 JSON 數(shù)據(jù)結(jié)構(gòu),我們的代碼也需要不斷地優(yōu)化和完善,才能滿足各種需求。