在C語(yǔ)言中使用json格式數(shù)據(jù)是非常常見(jiàn)的場(chǎng)景,而嵌套的json格式數(shù)據(jù)又是其中最為常見(jiàn)的形式之一。
在常見(jiàn)的json庫(kù)中,每個(gè)json值都可以通過(guò)一個(gè)結(jié)構(gòu)體進(jìn)行表示。而針對(duì)嵌套的json數(shù)據(jù),結(jié)構(gòu)體的嵌套也就不可避免。一個(gè)最為常見(jiàn)的嵌套結(jié)構(gòu)示例如下:
{ "name": "Tom", "age": 20, "address": { "country": "China", "province": "Jiangsu", "city": "Suzhou" } }
上述json數(shù)據(jù)中,address值對(duì)應(yīng)了一個(gè)嵌套的json結(jié)構(gòu)體,而該結(jié)構(gòu)體中又包含了三個(gè)成員:country、province和city。在C語(yǔ)言中表示上述json格式可以采用以下結(jié)構(gòu)體:
typedef struct _json_obj { enum _json_type type; //表示json值類(lèi)型 union { struct _json_obj *obj; //json對(duì)象類(lèi)型,該結(jié)構(gòu)體中嵌套了_json_obj結(jié)構(gòu)體,實(shí)現(xiàn)嵌套 char *str; int64_t i; double f; } v; } json_obj;
如上述結(jié)構(gòu)體所示,_json_obj中嵌套了自身,以便存儲(chǔ)json嵌套對(duì)象的數(shù)據(jù)。因此,上述json數(shù)據(jù)可以在C語(yǔ)言中對(duì)應(yīng)以下結(jié)構(gòu)體:
json_obj obj = { JSON_OBJ, { .obj = (json_obj*)malloc(sizeof(json_obj) * 3) } }; //針對(duì)obj->v.obj內(nèi)的三個(gè)值進(jìn)行賦值 obj->v.obj[0].type = JSON_STR; obj->v.obj[0].v.str = strdup("China"); obj->v.obj[1].type = JSON_STR; obj->v.obj[1].v.str = strdup("Jiangsu"); obj->v.obj[2].type = JSON_STR; obj->v.obj[2].v.str = strdup("Suzhou"); //將obj賦值給address json_obj *address = (json_obj*)malloc(sizeof(json_obj)); address->type = JSON_OBJ; address->v.obj = obj->v.obj;
使用以上代碼可以實(shí)現(xiàn)對(duì)于json嵌套對(duì)象的存儲(chǔ),并且可以根據(jù)需要擴(kuò)展更深層次的嵌套。
上一篇c json 傳輸文件
下一篇c json 中文 編碼