日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

C語(yǔ)言中一種cJSON與結(jié)構(gòu)體互轉(zhuǎn)的方法

來(lái)源: 責(zé)編: 時(shí)間:2024-02-29 14:43:31 188觀(guān)看
導(dǎo)讀前言json是目前最為流行的文本數(shù)據(jù)傳輸格式,特別是在網(wǎng)絡(luò)通信上廣泛應(yīng)用,隨著物聯(lián)網(wǎng)的興起,在嵌入式設(shè)備上,也需要開(kāi)始使用json進(jìn)行數(shù)據(jù)傳輸,那么,如何快速簡(jiǎn)潔地用C語(yǔ)言進(jìn)行json的序列化和反序列化呢?當(dāng)前,應(yīng)用最廣泛的C語(yǔ)言

前言

json是目前最為流行的文本數(shù)據(jù)傳輸格式,特別是在網(wǎng)絡(luò)通信上廣泛應(yīng)用,隨著物聯(lián)網(wǎng)的興起,在嵌入式設(shè)備上,也需要開(kāi)始使用json進(jìn)行數(shù)據(jù)傳輸,那么,如何快速簡(jiǎn)潔地用C語(yǔ)言進(jìn)行json的序列化和反序列化呢?ooy28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)前,應(yīng)用最廣泛的C語(yǔ)言json解析庫(kù)當(dāng)屬cJSON,但是,使用cJSON讀json進(jìn)行序列化和反序列化,需要根據(jù)key一個(gè)一個(gè)進(jìn)行處理,會(huì)導(dǎo)致代碼冗余,邏輯性不強(qiáng),哪有沒(méi)有更好的方法呢?ooy28資訊網(wǎng)——每日最新資訊28at.com

ooy28資訊網(wǎng)——每日最新資訊28at.com

思路

在Android平臺(tái),一般會(huì)使用gson等工具解析json,這些工具將json直接映射成對(duì)象,在C語(yǔ)言上使用對(duì)象的概念,我們需要借助結(jié)構(gòu)體,然而,最大的問(wèn)題在于,C語(yǔ)言沒(méi)有高級(jí)語(yǔ)言具有的反射機(jī)制,直接從json映射到結(jié)構(gòu)體對(duì)象幾乎是不可能的。ooy28資訊網(wǎng)——每日最新資訊28at.com

怎么解決呢,既然C語(yǔ)言沒(méi)有反射機(jī)制,那么我們可以自己定義一套類(lèi)似于反射的機(jī)制,這里我將其稱(chēng)之為結(jié)構(gòu)體數(shù)據(jù)模型,在數(shù)據(jù)模型中,我們需要準(zhǔn)確地描述結(jié)構(gòu)體的特征,包括結(jié)構(gòu)體各成員的名稱(chēng),類(lèi)型,在結(jié)構(gòu)體中的偏移。ooy28資訊網(wǎng)——每日最新資訊28at.com

有了這些,我們可以在解析josn的時(shí)候,將解析得到的數(shù)據(jù)直接寫(xiě)入到對(duì)應(yīng)的內(nèi)存里面去,或者是在序列化的時(shí)候,直接從對(duì)應(yīng)的內(nèi)存中讀取數(shù)據(jù),進(jìn)行處理。ooy28資訊網(wǎng)——每日最新資訊28at.com

實(shí)現(xiàn)

CSON正是采用上面說(shuō)到的思路,使用數(shù)據(jù)模型對(duì)結(jié)構(gòu)體進(jìn)行描述,然后基于cJSON,根據(jù)數(shù)據(jù)模型進(jìn)行解析,將解析得到的數(shù)據(jù)直接寫(xiě)入到對(duì)應(yīng)的內(nèi)存區(qū)域,從而實(shí)現(xiàn)從json到結(jié)構(gòu)體對(duì)象的映射。ooy28資訊網(wǎng)——每日最新資訊28at.com

CSON最基本的數(shù)據(jù)模型定義如下:ooy28資訊網(wǎng)——每日最新資訊28at.com

typedef struct cson_model{    CsonType type;                      /**< 數(shù)據(jù)類(lèi)型 */    char *key;                          /**< 元素鍵值 */    short offset;                       /**< 元素偏移 */} CsonModel;

通過(guò)type描述結(jié)構(gòu)體成員的數(shù)據(jù)類(lèi)型,key描述該成員在json中對(duì)應(yīng)的字段,offset描述該結(jié)構(gòu)體成員在結(jié)構(gòu)體中的偏移,CSON在解析json的時(shí)候,根據(jù)type調(diào)用相應(yīng)的cJSON API并傳遞key作為參數(shù),得到解析出的數(shù)據(jù),然后根據(jù)offset將數(shù)據(jù)寫(xiě)入到對(duì)應(yīng)的內(nèi)存空間。ooy28資訊網(wǎng)——每日最新資訊28at.com

比如說(shuō)這樣一個(gè)結(jié)構(gòu)體:ooy28資訊網(wǎng)——每日最新資訊28at.com

struct project{    int id;    char *name;}

該結(jié)構(gòu)體包含兩個(gè)成員,對(duì)于成員id,我們使用數(shù)據(jù)模型對(duì)其進(jìn)行描述:ooy28資訊網(wǎng)——每日最新資訊28at.com

{.type=CSON_TYPE_CHAR, key="id", offset=0}

對(duì)于結(jié)構(gòu)體的每個(gè)成員,都進(jìn)行數(shù)據(jù)模型的定義,就可以得到一個(gè)完整的結(jié)構(gòu)體數(shù)據(jù)模型,CSON會(huì)根據(jù)這個(gè)模型,進(jìn)行解析。ooy28資訊網(wǎng)——每日最新資訊28at.com

因?yàn)槭峭ㄟ^(guò)直接寫(xiě)內(nèi)存的方式,所以在寫(xiě)不同類(lèi)型的量到內(nèi)存中時(shí),會(huì)多次用到強(qiáng)制轉(zhuǎn)型,導(dǎo)致CSON中賦值的代碼都類(lèi)似于:ooy28資訊網(wǎng)——每日最新資訊28at.com

*(int *)((int)obj + model[i].offset) = (int)csonDecodeNumber(json, model[i].key);

當(dāng)然,上面說(shuō)到的數(shù)據(jù)模型,只適用于基本數(shù)據(jù)類(lèi)型的數(shù)據(jù),對(duì)于子結(jié)構(gòu)體,鏈表,數(shù)組等,需要對(duì)數(shù)據(jù)模型的定義進(jìn)行擴(kuò)充,有興趣的朋友可以直接閱讀CSON源碼。ooy28資訊網(wǎng)——每日最新資訊28at.com

CSON使用實(shí)例

(1) 聲明結(jié)構(gòu)體:ooy28資訊網(wǎng)——每日最新資訊28at.com

/** 項(xiàng)目結(jié)構(gòu)體 */struct project{    int id;    char *name;};/** 倉(cāng)庫(kù)結(jié)構(gòu)體 */struct hub{    int id;    char *user;    struct project *cson;};

(2) 定義數(shù)據(jù)模型:ooy28資訊網(wǎng)——每日最新資訊28at.com

對(duì)每一個(gè)需要使用cson的結(jié)構(gòu)體,都需要定義相對(duì)應(yīng)的數(shù)據(jù)模型ooy28資訊網(wǎng)——每日最新資訊28at.com

/** 項(xiàng)目結(jié)構(gòu)體數(shù)據(jù)模型 */CsonModel projectModel[] ={    CSON_MODEL_OBJ(struct project),    CSON_MODEL_INT(struct project, id),    CSON_MODEL_STRING(struct project, name),};/** 倉(cāng)庫(kù)結(jié)構(gòu)體數(shù)據(jù)模型 */CsonModel hubModel[] ={    CSON_MODEL_OBJ(struct hub),    CSON_MODEL_INT(struct hub, id),    CSON_MODEL_STRING(struct hub, user),    CSON_MODEL_STRUCT(struct hub, cson, projectModel, sizeof(projectModel)/sizeof(CsonModel))};

(3) 使用CSON解析:ooy28資訊網(wǎng)——每日最新資訊28at.com

只需要定義好數(shù)據(jù)模型,就可以使用CSON讀json進(jìn)行序列化和反序列化ooy28資訊網(wǎng)——每日最新資訊28at.com

void csonDemo(void){    char *jsonDemo = "{/"id/": 1, /"user/": /"Letter/", /"cson/": {/"id/": 2, /"name/": /"cson/"}}";    /** 解析json */    struct hub *pHub = csonDecode(jsonDemo, hubModel, sizeof(hubModel)/sizeof(CsonModel));    printf("hub: id: %d, user: %s, project id: %d, project name: %s/r/n",        pHub->id, pHub->user, pHub->cson->id, pHub->cson->name);    /** 序列化對(duì)象 */    char *formatJson = csonEncodeFormatted(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));    printf("format json: %s/r/n", formatJson);    /** 釋放結(jié)構(gòu)體對(duì)象 */    csonFree(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));    /** 釋放序列化生成的json字符串 */    csonFreeJson(formatJson);}

運(yùn)行結(jié)果:ooy28資訊網(wǎng)——每日最新資訊28at.com

hub: id: 1, user: Letter, project id: 2, project name: csonformat json: {        "id":   1,        "user": "Letter",        "cson": {                "id":   2,                "name": "cson"        }}

可以看到,無(wú)論是解析json,還是序列化結(jié)構(gòu)體到j(luò)son,在使用CSON的情況下,都只需要一行代碼就可以解決,同樣的操作,在使用原生cJSON的情況下,你可能需要多次判斷,解析元素。ooy28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-75352-0.htmlC語(yǔ)言中一種cJSON與結(jié)構(gòu)體互轉(zhuǎn)的方法

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 掌握Python匿名大師:lambda函數(shù)使用技巧大公開(kāi)

下一篇: 字節(jié)跳動(dòng)最熱門(mén)的15個(gè)前端開(kāi)源項(xiàng)目

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 汝城县| 大安市| 淮滨县| 仙桃市| 遵化市| 定边县| 财经| 博罗县| 马边| 门头沟区| 乌兰浩特市| 河东区| 长乐市| 新密市| 金门县| 大宁县| 土默特左旗| 莆田市| 宜宾县| 邯郸市| 临朐县| 墨江| 蓬安县| 沅江市| 东莞市| 潜江市| 古田县| 崇阳县| 玛沁县| 惠来县| 兴仁县| 滨州市| 星子县| 莆田市| 普宁市| 永顺县| 林芝县| 广灵县| 衡阳县| 云和县| 丁青县|