JSON是一種輕量級數(shù)據(jù)交換格式,具有簡潔、易讀的特點(diǎn),可以很好的解決數(shù)據(jù)之間的傳輸問題。而C JSON是基于C語言的一種JSON解析器,可以幫助開發(fā)者將JSON對象轉(zhuǎn)換成C語言中對應(yīng)的結(jié)構(gòu)體。在C JSON中,嵌套的JSON對象的反序列化特別重要,現(xiàn)在就讓我們來看一下如何使用C JSON反序列化嵌套的JSON對象。
#include "cJSON.h" #include#include #include typedef struct { int id; char* name; } Student; typedef struct { char* departmentName; Student studentList[10]; } Department; int main() { char* jsonStr = "{\"departmentName\":\"Computer Science\",\"studentList\":[{\"id\":1,\"name\":\"Alice\"},{\"id\":2,\"name\":\"Bob\"}]}"; cJSON* root = cJSON_Parse(jsonStr); if(NULL == root) { printf("parse error!\n"); return -1; } cJSON* departmentNameObj = cJSON_GetObjectItem(root, "departmentName"); if(NULL == departmentNameObj) { cJSON_Delete(root); printf("get departmentName error!\n"); return -1; } cJSON* studentListObj = cJSON_GetObjectItem(root, "studentList"); if(NULL == studentListObj) { cJSON_Delete(root); printf("get studentList error!\n"); return -1; } Department dept; dept.departmentName = departmentNameObj->valuestring; memset(&dept.studentList, 0, sizeof(dept.studentList));//清空數(shù)組 int listSize = cJSON_GetArraySize(studentListObj); for(int i = 0; i< listSize; i++) { cJSON* item = cJSON_GetArrayItem(studentListObj, i); if(NULL != item) { cJSON* idObj = cJSON_GetObjectItem(item, "id"); cJSON* nameObj = cJSON_GetObjectItem(item, "name"); if(NULL != idObj && NULL != nameObj) { dept.studentList[i].id = idObj->valueint; dept.studentList[i].name = nameObj->valuestring; } } } cJSON_Delete(root); return 0; }
上述代碼中定義了兩個(gè)結(jié)構(gòu)體,一個(gè)是學(xué)生(Student),一個(gè)是部門(Department)。Department中有一個(gè)學(xué)生列表,即studentList,我們將在下面的代碼中使用C JSON解析這個(gè)json字符串,并完成嵌套的JSON對象反序列化。
首先,我們需要定義一個(gè)JSON字符串,如下所示:
{ "departmentName":"Computer Science", "studentList":[ { "id":1, "name":"Alice" }, { "id":2, "name":"Bob" } ] }
然后我們先使用cJSON_Parse函數(shù)解析這段JSON字符串,如果解析失敗,則返回NULL。
接下來,我們使用cJSON_GetObjectItem函數(shù)獲取JSON對象中的departmentName和studentList。如果獲取失敗,則需要使用cJSON_Delete函數(shù)釋放內(nèi)存并返回錯(cuò)誤信息。
接著我們定義一個(gè)Department類型的變量,將departmentName的字符串指針賦值給departmentName屬性。同時(shí)使用memset函數(shù)將studentList數(shù)組清空,以便后續(xù)賦值操作。
使用cJSON_GetArraySize函數(shù)獲取studentList數(shù)組的長度,并使用for循環(huán)逐一獲取其中的元素。針對每個(gè)元素,我們分別使用cJSON_GetObjectItem獲取id和name屬性,并逐一賦值給Department中相應(yīng)的學(xué)生對象。
最后我們調(diào)用cJSON_Delete來釋放內(nèi)存。
在以上過程中,我們使用了C JSON中大量的API函數(shù),這些函數(shù)一目了然地指明了每個(gè)函數(shù)需要完成的任務(wù),同時(shí)編寫時(shí)也需要格外小心。如果遇到問題,我們可以先使用printf等調(diào)試工具來輸出調(diào)試信息,確認(rèn)到底是哪一步發(fā)生了錯(cuò)誤,進(jìn)而進(jìn)行相應(yīng)的調(diào)整和反復(fù)嘗試。