在C語(yǔ)言中,要解析和加載JSON數(shù)據(jù),可以使用一些開(kāi)源庫(kù),例如cJSON、jansson、yajl等等。其中比較常用的是cJSON。
cJSON是一個(gè)輕量級(jí)的JSON解析器,可以解析JSON格式的字符串并以C語(yǔ)言中的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)。cJSON存在于單一的.h頭文件中,使用十分方便,只需要包含頭文件即可。
/* * 示例代碼:解析JSON數(shù)據(jù)并打印出對(duì)應(yīng)的值 */ #include <stdio.h> #include <cJSON.h> int main() { char* json_data = "{\"name\":\"張三\", \"age\": 23, \"hobby\":[\"basketball\",\"music\"]}"; cJSON* json = cJSON_Parse(json_data); if (!json) { printf("Error before: [%s]\n", cJSON_GetErrorPtr()); return 1; } cJSON* name = cJSON_GetObjectItem(json, "name"); cJSON* age = cJSON_GetObjectItem(json, "age"); cJSON* hobby = cJSON_GetObjectItem(json, "hobby"); printf("姓名:%s\n", name->valuestring); printf("年齡:%d\n", age->valueint); printf("愛(ài)好:\n"); cJSON* hobby_item = NULL; cJSON_ArrayForEach(hobby_item, hobby) { printf("%s\n", hobby_item->valuestring); } cJSON_Delete(json); // 記得釋放內(nèi)存 return 0; }
該示例代碼中,首先定義了一個(gè)JSON格式的字符串,接著調(diào)用cJSON_Parse函數(shù)將json_data解析成CJSON結(jié)構(gòu)體,如果解析失敗則會(huì)返回NULL。然后通過(guò)cJSON_GetObjectItem函數(shù)獲得對(duì)應(yīng)的值,其中需要傳入解析后的CJSON結(jié)構(gòu)體和要獲取值的鍵名。通過(guò)該函數(shù)獲取到的值是CJSON中的最小單元,可以使用不同的value*類(lèi)型訪問(wèn)其值。最后使用cJSON_ArrayForEach函數(shù)遍歷數(shù)組類(lèi)型的值。