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

當前位置:首頁 > 科技  > 軟件

C語言中一種cJSON與結構體互轉的方法

來源: 責編: 時間:2024-02-29 14:43:31 261觀看
導讀前言json是目前最為流行的文本數據傳輸格式,特別是在網絡通信上廣泛應用,隨著物聯網的興起,在嵌入式設備上,也需要開始使用json進行數據傳輸,那么,如何快速簡潔地用C語言進行json的序列化和反序列化呢?當前,應用最廣泛的C語言

前言

json是目前最為流行的文本數據傳輸格式,特別是在網絡通信上廣泛應用,隨著物聯網的興起,在嵌入式設備上,也需要開始使用json進行數據傳輸,那么,如何快速簡潔地用C語言進行json的序列化和反序列化呢?UCh28資訊網——每日最新資訊28at.com

當前,應用最廣泛的C語言json解析庫當屬cJSON,但是,使用cJSON讀json進行序列化和反序列化,需要根據key一個一個進行處理,會導致代碼冗余,邏輯性不強,哪有沒有更好的方法呢?UCh28資訊網——每日最新資訊28at.com

UCh28資訊網——每日最新資訊28at.com

思路

在Android平臺,一般會使用gson等工具解析json,這些工具將json直接映射成對象,在C語言上使用對象的概念,我們需要借助結構體,然而,最大的問題在于,C語言沒有高級語言具有的反射機制,直接從json映射到結構體對象幾乎是不可能的。UCh28資訊網——每日最新資訊28at.com

怎么解決呢,既然C語言沒有反射機制,那么我們可以自己定義一套類似于反射的機制,這里我將其稱之為結構體數據模型,在數據模型中,我們需要準確地描述結構體的特征,包括結構體各成員的名稱,類型,在結構體中的偏移。UCh28資訊網——每日最新資訊28at.com

有了這些,我們可以在解析josn的時候,將解析得到的數據直接寫入到對應的內存里面去,或者是在序列化的時候,直接從對應的內存中讀取數據,進行處理。UCh28資訊網——每日最新資訊28at.com

實現

CSON正是采用上面說到的思路,使用數據模型對結構體進行描述,然后基于cJSON,根據數據模型進行解析,將解析得到的數據直接寫入到對應的內存區域,從而實現從json到結構體對象的映射。UCh28資訊網——每日最新資訊28at.com

CSON最基本的數據模型定義如下:UCh28資訊網——每日最新資訊28at.com

typedef struct cson_model{    CsonType type;                      /**< 數據類型 */    char *key;                          /**< 元素鍵值 */    short offset;                       /**< 元素偏移 */} CsonModel;

通過type描述結構體成員的數據類型,key描述該成員在json中對應的字段,offset描述該結構體成員在結構體中的偏移,CSON在解析json的時候,根據type調用相應的cJSON API并傳遞key作為參數,得到解析出的數據,然后根據offset將數據寫入到對應的內存空間。UCh28資訊網——每日最新資訊28at.com

比如說這樣一個結構體:UCh28資訊網——每日最新資訊28at.com

struct project{    int id;    char *name;}

該結構體包含兩個成員,對于成員id,我們使用數據模型對其進行描述:UCh28資訊網——每日最新資訊28at.com

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

對于結構體的每個成員,都進行數據模型的定義,就可以得到一個完整的結構體數據模型,CSON會根據這個模型,進行解析。UCh28資訊網——每日最新資訊28at.com

因為是通過直接寫內存的方式,所以在寫不同類型的量到內存中時,會多次用到強制轉型,導致CSON中賦值的代碼都類似于:UCh28資訊網——每日最新資訊28at.com

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

當然,上面說到的數據模型,只適用于基本數據類型的數據,對于子結構體,鏈表,數組等,需要對數據模型的定義進行擴充,有興趣的朋友可以直接閱讀CSON源碼。UCh28資訊網——每日最新資訊28at.com

CSON使用實例

(1) 聲明結構體:UCh28資訊網——每日最新資訊28at.com

/** 項目結構體 */struct project{    int id;    char *name;};/** 倉庫結構體 */struct hub{    int id;    char *user;    struct project *cson;};

(2) 定義數據模型:UCh28資訊網——每日最新資訊28at.com

對每一個需要使用cson的結構體,都需要定義相對應的數據模型UCh28資訊網——每日最新資訊28at.com

/** 項目結構體數據模型 */CsonModel projectModel[] ={    CSON_MODEL_OBJ(struct project),    CSON_MODEL_INT(struct project, id),    CSON_MODEL_STRING(struct project, name),};/** 倉庫結構體數據模型 */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解析:UCh28資訊網——每日最新資訊28at.com

只需要定義好數據模型,就可以使用CSON讀json進行序列化和反序列化UCh28資訊網——每日最新資訊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);    /** 序列化對象 */    char *formatJson = csonEncodeFormatted(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));    printf("format json: %s/r/n", formatJson);    /** 釋放結構體對象 */    csonFree(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));    /** 釋放序列化生成的json字符串 */    csonFreeJson(formatJson);}

運行結果:UCh28資訊網——每日最新資訊28at.com

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

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

本文鏈接:http://m.www897cc.com/showinfo-26-75352-0.htmlC語言中一種cJSON與結構體互轉的方法

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 掌握Python匿名大師:lambda函數使用技巧大公開

下一篇: 字節跳動最熱門的15個前端開源項目

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久久91精品国产| 在线观看日韩av电影| 欧美日韩日本网| 国产精品女主播一区二区三区| 国产精品色网| 国产一区二区看久久| 亚洲国产精品热久久| 一本色道精品久久一区二区三区| 亚洲自啪免费| 久久久国产精品亚洲一区 | 欧美激情a∨在线视频播放| 欧美精品国产一区二区| 国产精品国产三级国产aⅴ无密码| 国产女主播在线一区二区| 极品少妇一区二区| 日韩一二三区视频| 欧美在线观看www| 欧美福利一区二区| 国产精品亚洲综合一区在线观看| 在线视频国产日韩| 亚洲男人av电影| 欧美www在线| 国产噜噜噜噜噜久久久久久久久| 亚洲国产高清高潮精品美女| 亚洲欧美成人综合| 欧美国产乱视频| 国产日韩欧美中文| 日韩亚洲在线观看| 久久人91精品久久久久久不卡| 欧美日韩一区二区国产| 狠狠色丁香婷综合久久| 一区二区三区国产在线观看| 久久久蜜臀国产一区二区| 欧美日韩在线精品| 一区二区三区在线高清| 亚洲一区二区三区高清| 女女同性女同一区二区三区91| 国产精品视频午夜| 亚洲免费观看高清完整版在线观看熊| 久久99伊人| 欧美性大战久久久久久久蜜臀| 1024成人| 久久精品99国产精品日本| 欧美图区在线视频| 亚洲国产欧美国产综合一区| 亚洲欧美日韩在线高清直播| 欧美日本中文字幕| 在线观看亚洲一区| 欧美一级大片在线观看| 欧美视频免费在线| 亚洲欧洲一级| 老司机一区二区三区| 国产一区二区欧美日韩| 亚洲欧美国产va在线影院| 欧美日本一区二区三区| 亚洲欧洲精品一区二区精品久久久| 久久福利视频导航| 国产精品日本一区二区| 一本一道久久综合狠狠老精东影业| 欧美sm视频| 影音先锋亚洲精品| 久久国产精品高清| 国产精品一区久久| 亚洲一二三级电影| 欧美日韩视频在线观看一区二区三区| 亚洲国产日韩欧美在线动漫| 久久久噜噜噜久噜久久 | 中文在线一区| 欧美日韩国产另类不卡| 亚洲精品国产精品国自产在线| 老司机一区二区三区| 激情久久久久| 久久久不卡网国产精品一区| 国产亚洲一区在线| 欧美在线国产精品| 国产婷婷色综合av蜜臀av| 亚洲综合电影| 国产精品国产三级国产aⅴ无密码| 夜夜嗨av一区二区三区四季av| 欧美激情精品久久久| 亚洲经典三级| 欧美国产精品日韩| 亚洲免费久久| 欧美日韩亚洲成人| 一区二区三区**美女毛片| 欧美日韩一区二区国产| 亚洲网站视频| 国产精品久久久久久久久久三级 | 久久综合中文| 尤物99国产成人精品视频| 久久综合亚州| 亚洲精品1区| 欧美精品在线免费| 一个人看的www久久| 欧美午夜精品久久久久久久| 亚洲一区www| 国产伦精品一区二区三区免费迷 | 欧美极品aⅴ影院| 夜夜嗨av一区二区三区四季av | 国产精品久久久久影院亚瑟| 亚洲欧美日韩一区在线| 国产婷婷一区二区| 久久婷婷久久| 亚洲免费福利视频| 欧美系列电影免费观看| 午夜精品久久久久99热蜜桃导演| 国产日韩欧美精品| 久久久久久久性| 亚洲欧洲精品一区| 欧美涩涩网站| 欧美在线播放高清精品| 在线日韩av片| 欧美日韩亚洲在线| 欧美一二三区在线观看| 在线观看成人av| 欧美精品不卡| 亚洲在线观看免费| 尤物视频一区二区| 欧美日韩精选| 欧美伊人久久久久久午夜久久久久| 亚洲第一精品夜夜躁人人爽| 欧美日韩视频在线观看一区二区三区 | 亚洲一区二区在线看| 国产一区二区视频在线观看 | 欧美日韩一区二区三区在线 | 欧美性理论片在线观看片免费| 欧美尤物一区| 最新国产成人在线观看| 欧美午夜免费| 久久精品国产一区二区三区免费看| 亚洲人成在线观看一区二区| 国产精品日本一区二区| 卡一卡二国产精品| 亚洲专区欧美专区| 亚洲国产另类精品专区| 国产精品乱码久久久久久| 久久久久久网| 在线亚洲欧美视频| 伊人久久成人| 国产精品久久激情| 蜜臀av在线播放一区二区三区| 亚洲手机视频| 亚洲福利专区| 国产精品日日摸夜夜摸av| 欧美高清视频一二三区| 欧美一区二区高清| 亚洲另类在线一区| 狠狠久久婷婷| 国产精品高清网站| 欧美成人一二三| 久久久91精品国产一区二区精品| 一区二区三区你懂的| 亚洲高清123| 国产亚洲毛片在线| 欧美视频在线观看一区| 玖玖综合伊人| 欧美一区二区三区在线播放| 一个人看的www久久| 精品91视频| 国产精品三级久久久久久电影| 欧美黑人多人双交| 久久久久网址| 午夜精品久久久久久久99樱桃| 亚洲精品一区二区三区av| 韩国福利一区| 国产欧美一级| 国产精品久久午夜| 欧美日韩国产在线| 欧美sm视频| 另类专区欧美制服同性| 欧美在线播放高清精品| 亚洲性视频网站| 日韩午夜中文字幕| 91久久久久久国产精品| 国内一区二区三区| 国产农村妇女毛片精品久久麻豆 | 欧美性大战久久久久| 欧美福利电影网| 美女主播一区| 久久久噜噜噜久久人人看| 午夜精品久久久久| 亚洲社区在线观看| 99天天综合性| 亚洲精品一区中文| 亚洲国产一区二区三区青草影视| 国语自产在线不卡| 国外成人在线视频| 国产亚洲一区二区精品| 国产精品日韩一区| 国产精品久久久亚洲一区| 欧美午夜不卡在线观看免费 | 国产精品伊人日日| 欧美午夜电影在线观看| 欧美日韩在线观看一区二区三区| 欧美日韩国产麻豆| 欧美视频网站| 欧美三级欧美一级| 欧美午夜免费电影| 国产精品久久久99| 国产精品成人一区二区三区吃奶| 欧美日韩在线第一页| 欧美色图麻豆| 国产精品久久7| 国产精品一卡二卡|