精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

開發(fā)
隨著物聯(lián)網(wǎng)的興起,在嵌入式設(shè)備上,也需要開始使用json進行數(shù)據(jù)傳輸,那么,如何快速簡潔地用C語言進行json的序列化和反序列化呢?

前言

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

當前,應(yīng)用最廣泛的C語言json解析庫當屬cJSON,但是,使用cJSON讀json進行序列化和反序列化,需要根據(jù)key一個一個進行處理,會導致代碼冗余,邏輯性不強,哪有沒有更好的方法呢?

思路

在Android平臺,一般會使用gson等工具解析json,這些工具將json直接映射成對象,在C語言上使用對象的概念,我們需要借助結(jié)構(gòu)體,然而,最大的問題在于,C語言沒有高級語言具有的反射機制,直接從json映射到結(jié)構(gòu)體對象幾乎是不可能的。

怎么解決呢,既然C語言沒有反射機制,那么我們可以自己定義一套類似于反射的機制,這里我將其稱之為結(jié)構(gòu)體數(shù)據(jù)模型,在數(shù)據(jù)模型中,我們需要準確地描述結(jié)構(gòu)體的特征,包括結(jié)構(gòu)體各成員的名稱,類型,在結(jié)構(gòu)體中的偏移。

有了這些,我們可以在解析josn的時候,將解析得到的數(shù)據(jù)直接寫入到對應(yīng)的內(nèi)存里面去,或者是在序列化的時候,直接從對應(yīng)的內(nèi)存中讀取數(shù)據(jù),進行處理。

實現(xiàn)

CSON正是采用上面說到的思路,使用數(shù)據(jù)模型對結(jié)構(gòu)體進行描述,然后基于cJSON,根據(jù)數(shù)據(jù)模型進行解析,將解析得到的數(shù)據(jù)直接寫入到對應(yīng)的內(nèi)存區(qū)域,從而實現(xiàn)從json到結(jié)構(gòu)體對象的映射。

CSON最基本的數(shù)據(jù)模型定義如下:

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

通過type描述結(jié)構(gòu)體成員的數(shù)據(jù)類型,key描述該成員在json中對應(yīng)的字段,offset描述該結(jié)構(gòu)體成員在結(jié)構(gòu)體中的偏移,CSON在解析json的時候,根據(jù)type調(diào)用相應(yīng)的cJSON API并傳遞key作為參數(shù),得到解析出的數(shù)據(jù),然后根據(jù)offset將數(shù)據(jù)寫入到對應(yīng)的內(nèi)存空間。

比如說這樣一個結(jié)構(gòu)體:

struct project
{
    int id;
    char *name;
}

該結(jié)構(gòu)體包含兩個成員,對于成員id,我們使用數(shù)據(jù)模型對其進行描述:

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

對于結(jié)構(gòu)體的每個成員,都進行數(shù)據(jù)模型的定義,就可以得到一個完整的結(jié)構(gòu)體數(shù)據(jù)模型,CSON會根據(jù)這個模型,進行解析。

因為是通過直接寫內(nèi)存的方式,所以在寫不同類型的量到內(nèi)存中時,會多次用到強制轉(zhuǎn)型,導致CSON中賦值的代碼都類似于:

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

當然,上面說到的數(shù)據(jù)模型,只適用于基本數(shù)據(jù)類型的數(shù)據(jù),對于子結(jié)構(gòu)體,鏈表,數(shù)組等,需要對數(shù)據(jù)模型的定義進行擴充,有興趣的朋友可以直接閱讀CSON源碼。

CSON使用實例

(1) 聲明結(jié)構(gòu)體:

/** 項目結(jié)構(gòu)體 */
struct project
{
    int id;
    char *name;
};

/** 倉庫結(jié)構(gòu)體 */
struct hub
{
    int id;
    char *user;
    struct project *cson;
};

(2) 定義數(shù)據(jù)模型:

對每一個需要使用cson的結(jié)構(gòu)體,都需要定義相對應(yīng)的數(shù)據(jù)模型

/** 項目結(jié)構(gòu)體數(shù)據(jù)模型 */
CsonModel projectModel[] =
{
    CSON_MODEL_OBJ(struct project),
    CSON_MODEL_INT(struct project, id),
    CSON_MODEL_STRING(struct project, name),
};

/** 倉庫結(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解析:

只需要定義好數(shù)據(jù)模型,就可以使用CSON讀json進行序列化和反序列化

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);

    /** 釋放結(jié)構(gòu)體對象 */
    csonFree(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));

    /** 釋放序列化生成的json字符串 */
    csonFreeJson(formatJson);
}

運行結(jié)果:

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

可以看到,無論是解析json,還是序列化結(jié)構(gòu)體到j(luò)son,在使用CSON的情況下,都只需要一行代碼就可以解決,同樣的操作,在使用原生cJSON的情況下,你可能需要多次判斷,解析元素。

責任編輯:趙寧寧 來源: AI讓生活更美好
相關(guān)推薦

2020-07-21 15:20:20

語言結(jié)構(gòu)體共用體

2010-01-21 16:24:02

C++語言

2023-07-29 15:03:29

2021-04-20 09:00:48

Go 語言結(jié)構(gòu)體type

2010-01-25 15:09:17

C++語言

2009-08-14 11:05:28

C#語言的結(jié)構(gòu)體

2020-12-14 06:43:02

并發(fā)編程JDK

2015-08-31 09:27:21

語言界面UI

2015-08-03 09:36:01

賽迪翻譯

2018-06-21 14:20:24

Linuxfindfd

2014-02-10 15:05:37

C語言封裝

2014-03-19 15:41:21

編程語言編程規(guī)則

2013-06-26 10:13:32

C語言結(jié)構(gòu)體結(jié)構(gòu)體偏移

2021-12-09 15:37:50

自動駕駛數(shù)據(jù)人工智能

2022-08-19 14:38:52

C語言結(jié)構(gòu)體struct

2010-12-30 09:22:58

C語言 數(shù)組

2020-03-30 09:22:36

C語言結(jié)構(gòu)體

2023-07-18 18:10:04

2020-05-19 17:07:09

Spark測試數(shù)據(jù)計算

2018-12-14 14:30:12

安全檢測布式系測試
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品女视频| 亚洲欧美日韩一区二区三区在线| 亚洲最大的av网站| 精品视频一区二区在线观看| 欧美激情99| 欧美午夜精品一区| 日韩尤物视频| www香蕉视频| 中文字幕免费精品| 国产视频精品xxxx| 国产不卡的av| 国产日韩另类视频一区| 一区二区不卡在线播放| 日韩精品电影网站| 四虎影院在线免费播放| 日韩av字幕| 9191国产精品| 欧美乱做爰xxxⅹ久久久| 国产在线观看免费| 理论电影国产精品| 欧美成年人视频网站欧美| 中文字幕一区二区三区人妻电影| 欧美成人影院| 亚洲成人资源在线| 桥本有菜av在线| 裸体xxxx视频在线| 99久久综合精品| 51国偷自产一区二区三区的来源| 国产大片中文字幕| 亚洲成人精品| 最新国产成人av网站网址麻豆| 在线播放av中文字幕| 日韩av中字| 午夜伊人狠狠久久| 久久综合亚洲精品| 久草资源在线观看| 亚洲欧洲精品天堂一级| 日韩一区二区三区高清| 欧美捆绑视频| 99精品视频一区| 国产精品美女久久久久av福利| 中文字幕第四页| 国产情侣久久| 91黄色8090| 中文字幕一区二区三区手机版| 精品国产乱码| 亚洲图片欧美午夜| a天堂中文字幕| 国产欧美日韩在线观看视频| 亚洲精品久久在线| 日韩 中文字幕| 神马香蕉久久| 精品亚洲一区二区三区在线播放| 欧美又黄又嫩大片a级| 偷拍自拍在线看| 亚洲精品韩国| 久久躁狠狠躁夜夜爽| 亚洲综合自拍网| 欧洲亚洲一区二区三区| 亚洲精品福利在线| 黄色片视频免费观看| 婷婷亚洲精品| 亚洲视频在线免费观看| 日韩精品――色哟哟| 久久中文字幕一区二区| 日韩欧美电影一区| 涩视频在线观看| 日韩av影院| 在线电影欧美日韩一区二区私密| www.17c.com喷水少妇| 国产成人aa在线观看网站站| 亚洲精品99久久久久| 最新在线黄色网址| 国产亚洲一区| 久久精品视频va| 国产一级片免费看| 亚洲欧美久久| 成人h视频在线观看播放| 欧美精品一二三四区| 日韩精品一卡二卡三卡四卡无卡| 欧美亚洲伦理www| 国产91精品看黄网站在线观看| 伊人久久成人| 青青草国产精品一区二区| 中文字幕精品一区二区精| 韩国三级中文字幕hd久久精品| 国产精品福利片| 国产a级免费视频| 日韩视频一区| 国产97在线播放| 国产毛片毛片毛片毛片毛片| 欧美a一区二区| 亚洲精品免费一区二区三区| 一级片视频网站| 成人做爰69片免费看网站| 免费成人深夜夜行视频| 超碰在线网址| 亚洲色大成网站www久久九九| 一本一道久久a久久综合精品| aaa日本高清在线播放免费观看| 久久精品亚洲国产奇米99| 亚洲一区免费看| 新版的欧美在线视频| 欧美午夜电影在线| 国产黄色一级网站| 人人九九精品视频| 永久免费精品影视网站| 日韩 欧美 亚洲| 韩国成人精品a∨在线观看| 久久精品99久久| 中文字幕在线观看播放| 亚洲图片一区二区| 91国内在线播放| 亚洲免费专区| 日韩在线激情视频| 综合网在线观看| 日韩精品每日更新| 亚洲aⅴ日韩av电影在线观看| a网站在线观看| 国产三级欧美三级| 免费在线观看视频a| www欧美在线观看| 影音先锋日韩有码| 免费在线黄色片| 久久精品国产秦先生| dy888夜精品国产专区| 91在线直播| 日本黄色一区二区| 国产精品无码一区二区三| 欧美69视频| 成人欧美一区二区三区在线湿哒哒| 亚洲AV无码国产精品午夜字幕 | 国产99久久久| 成人夜色视频网站在线观看| 免费观看中文字幕| www.久久99| 日韩中文字幕在线观看| 最近中文字幕在线观看视频| 国内久久婷婷综合| 亚洲欧美日韩精品在线| 粉嫩91精品久久久久久久99蜜桃| 日韩一区二区三区在线| 97在线观看视频免费| 久久精品国产精品亚洲精品| 国产精品区一区二区三在线播放 | 美女国内精品自产拍在线播放| 国产污视频在线看| 成人精品视频一区二区三区尤物| 日韩妆和欧美的一区二区| 欧美亚洲日本精品| 日韩精品视频在线免费观看| 97超碰人人干| 久久婷婷一区二区三区| 亚洲爆乳无码专区| 国产精品美女久久久久久不卡| 欧美成人精品xxx| 懂色av中文字幕| 国产欧美日韩在线看| 天天爽人人爽夜夜爽| 日韩精品社区| 国产成人一区二区三区| aiai在线| 日韩欧美电影一二三| 日产精品久久久久久久| 久久久久一区二区三区四区| 成年人黄色片视频| 97在线精品| 岛国视频一区免费观看| 小视频免费在线观看| 国产一区二区三区直播精品电影| 日本一区二区三区免费视频| 成人av网站大全| 欧美激情国产精品日韩| 国产伦精品一区二区三区免费优势 | 国产尤物久久久| 久久久亚洲影院你懂的| 五月婷婷六月丁香综合| 欧美午夜精品电影| 欧美成人精品欧美一| 99视频有精品| 污版视频在线观看| 欧美体内she精视频在线观看| 国产区精品视频| 在线看一级片| 亚洲美女在线看| 国产孕妇孕交大片孕| 亚洲va欧美va人人爽| 337p日本欧洲亚洲大胆张筱雨| 亚洲自拍偷拍网| 免费h精品视频在线播放| 91精品福利观看| 51精品国产黑色丝袜高跟鞋| 秋霞午夜理伦电影在线观看| 亚洲成人国产精品| 最新国产中文字幕| 亚洲国产成人av网| 欧美无人区码suv| 另类中文字幕网| 久在线观看视频| 一区二区美女| 亚洲精品日韩激情在线电影| 国产在线更新| 亚洲男人的天堂网站| www.国产精品视频| 欧美三级在线播放| 黄色大片网站在线观看| 亚洲视频综合在线| 久久亚洲无码视频| 成人福利视频网站| 国产5g成人5g天天爽| 日韩精品欧美成人高清一区二区| 亚洲欧美日产图| 日韩深夜福利| 高清日韩一区| 国产一区二区三区免费观看在线 | 日本一区精品| 国产精品tv| 91视频99| 成人在线视频www| 国产成人啪精品视频免费网| av影视在线看| 欧美成人一二三| 91xxx在线观看| 欧美一区二区黄| 黄色片视频网站| 亚洲国产综合在线| 懂色av懂色av粉嫩av| 97久久久精品综合88久久| 免费人成视频在线播放| 另类人妖一区二区av| www.色就是色| 老司机免费视频久久 | 国产精品久久久久久久免费观看 | 欧美中文字幕一区二区| 久久av一区二区三区亚洲| 4438全国亚洲精品观看视频| 91精品国产电影| 电影k8一区二区三区久久| 久久伊人精品天天| 成人短视频在线观看| 久久久av网站| 欧美精品hd| 久久精品久久久久久| 国产1区在线| 欧美成人剧情片在线观看| 成人免费网站在线观看视频| 另类色图亚洲色图| 色噜噜狠狠狠综合欧洲色8| 久久这里只有精品99| 好操啊在线观看免费视频| 精品国产欧美一区二区五十路| 手机在线观看毛片| 亚洲精品国产精品国自产观看浪潮| 一级黄色片在线观看| 欧美另类一区二区三区| 97久久人国产精品婷婷| 日韩一级精品视频在线观看| www.xxxx国产| 日韩高清人体午夜| 国产在线你懂得| 在线观看日韩专区| 高h视频在线观看| 欧美国产精品人人做人人爱| eeuss鲁一区二区三区| 97超碰蝌蚪网人人做人人爽| 精品91久久| 国产日韩换脸av一区在线观看| 三级在线看中文字幕完整版| 啪一啪鲁一鲁2019在线视频| 播放一区二区| 91免费的视频在线播放| 97一区二区国产好的精华液| 国产一区精品在线| 国产精品密蕾丝视频下载| 久久福利电影| 日韩电影免费网站| 色播亚洲婷婷| 深爱激情综合| 自拍偷拍亚洲色图欧美| 国产精品jizz在线观看美国| 成人在线免费在线观看| 久久精品国产亚洲aⅴ| 国偷自产av一区二区三区麻豆| 国产精品白丝av| 色婷婷一区二区三区在线观看| 日本不卡视频一二三区| 国产一级不卡毛片| 久久久久欧美精品| 手机av在线免费| 99精品欧美一区二区三区小说 | 99草在线视频| 日韩大陆毛片av| 日韩毛片久久久| 午夜精品久久久久久久99黑人| 搞黄网站在线看| 欧美激情综合色| 国产激情欧美| 精品欧美一区二区精品久久| 欧美aaaaaaaaaaaa| 成年人视频观看| 国产剧情一区二区三区| 偷拍夫妻性生活| 亚洲综合在线观看视频| 国产情侣小视频| 亚洲国模精品一区| 97超碰资源站在线观看| 国产精品91久久| 成人h动漫精品一区二区器材| 国产日韩欧美二区| 偷偷www综合久久久久久久| 黄色a级片免费| 欧美aⅴ一区二区三区视频| wwww.国产| 91免费看`日韩一区二区| 成人免费视频网站入口::| 91久久免费观看| 亚洲 小说区 图片区 都市| 亚洲欧美综合图区| 1区2区3区在线观看| 57pao国产精品一区| 9999久久久久| www.18av.com| 可以看av的网站久久看| 国产精品久久无码| 亚洲观看高清完整版在线观看| 色一情一乱一伦| 欧美一区二区三区视频在线| 亚洲精品字幕在线| 亚洲色图五月天| av在线播放国产| 91久久国产精品| 日韩伦理一区二区三区| 又大又硬又爽免费视频| 日韩影院免费视频| 免费看污片的网站| 91福利视频在线| 韩国三级av在线免费观看| 欧美孕妇与黑人孕交| 超碰国产精品一区二页| 精品日韩美女| 亚洲看片一区| 91在线第一页| 一区二区三区四区五区视频在线观看 | 欧美码中文字幕在线| 久久精品视频91| 欧美国产一区二区在线观看| 伊人成年综合网| 中文字幕久热精品视频在线| 成人一区视频| 亚洲午夜激情| 国产一区二区看久久| 欧美卡一卡二卡三| 日韩精品一区二区三区视频在线观看 | 国产伦精品一区二区三区视频青涩 | 国产成人永久免费视频| 丁香天五香天堂综合| 黄色小视频在线免费看| 亚洲国产欧美精品| 亚洲精品**中文毛片| 欧美在线播放一区二区| 日韩中文字幕亚洲一区二区va在线 | 成人亚洲精品| av动漫在线播放| 91一区二区在线观看| 天天操天天干天天摸| www.久久撸.com| 91精品啪在线观看国产爱臀| 久久综合九色综合88i| 久久―日本道色综合久久| 国产亚洲精品久久久久久打不开| 91精品国产入口| 欧洲黄色一区| 欧洲一区二区在线 | 久久伊人精品视频| 成人高潮视频| 国产精品免费成人| 中文字幕一区二区三区乱码在线| 国产精品一区二区无码对白| 国产精品拍天天在线| 精品人妻无码一区二区色欲产成人 | 欧美日韩一区成人| 羞羞网站在线免费观看| 久久精品国产一区二区三区日韩| 激情综合电影网| 亚洲av无码一区二区三区人 | 99视频在线精品| 中文字幕人妻色偷偷久久| 伊人久久五月天| 秋霞午夜一区二区三区视频| 成人观看免费完整观看| 亚洲婷婷综合色高清在线| 91亚洲精品国偷拍自产在线观看| 在线观看国产欧美| 精品久久99| 欧美久久在线观看| 国产精品久久久久久久久免费樱桃| 91片黄在线观看喷潮| 另类专区欧美制服同性| 久久91精品| 丰满岳乱妇一区二区 |