色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

c json嵌套反序列化

李中冰1年前9瀏覽0評論

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#includetypedef 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ù)嘗試。