精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

日日碰狠狠丁香久燥| 欧美亚洲免费在线| 日本少妇性高潮| 亚洲va久久| 欧美午夜一区二区三区| 日韩视频一二三| 日本大臀精品| 国产在线国偷精品免费看| 亚洲欧美日韩国产成人| 中文字幕永久有效| 美女露胸视频在线观看| 亚洲色图.com| 日本一区二区三区视频免费看 | 理论片一区二区在线| 91久久奴性调教| www污在线观看| chinese偷拍一区二区三区| 国产黄色精品网站| 国产精品激情av电影在线观看 | 91精产国品一二三产区别沈先生| 国产黄在线播放| 成人免费视频一区| 成人做爽爽免费视频| 久久久久亚洲av成人毛片韩| 亚洲视频在线免费| 一区二区三区黄色| 国产成人在线综合| 欧美三级精品| 精品福利视频导航| 免费在线看黄色片| 你懂的在线视频| 美国毛片一区二区三区| 欧美精品在线看| 久久精品久久久精品美女| 欧美亚洲国产视频| 亚洲精品午夜久久久久久久| 午夜欧美精品| 精品亚洲va在线va天堂资源站| 免费大片在线观看| 日本蜜桃在线观看视频| 亚洲综合色视频| 无码人妻aⅴ一区二区三区日本| 香蕉久久国产av一区二区| 老妇喷水一区二区三区| 欧美亚洲成人网| 国内自拍在线观看| 深夜福利影院在线观看| 加勒比久久综合| 亚洲欧美日韩国产成人| 国产精品无码一区二区三区免费| 丝袜美腿一区| 亚洲嫩草精品久久| 中文字幕黄色大片| 成人在线网址| 亚洲精品国产一区二区精华液 | 97超级碰碰碰久久久| 丁香花五月婷婷| 欧洲美女日日| 色噜噜狠狠狠综合曰曰曰| 日批免费观看视频| 国产精品毛片视频| 日韩av在线导航| 亚洲黄色在线网站| 一区二区美女| 亚洲成在人线av| 91玉足脚交白嫩脚丫| 牲欧美videos精品| 亚洲午夜小视频| 天天色天天综合| 欧美日本一区| 5252色成人免费视频| 中文字幕在线播| 麻豆精品视频在线| 97人人模人人爽人人少妇| 亚洲精品久久久久avwww潮水 | 欧美综合一区第一页| 无码人妻久久一区二区三区| 青青草成人在线观看| 91久久久久久久一区二区| 亚洲av永久纯肉无码精品动漫| 男女男精品网站| 成人欧美一区二区三区在线湿哒哒| 日日夜夜操视频| 精品一区二区三区免费毛片爱| 国产精品高清在线| av老司机久久| 91网站在线观看视频| 色一情一乱一伦一区二区三区丨| 天堂91在线| 国产亚洲精aa在线看| 欧美一级免费大片| 污污视频在线免费| 任我爽精品视频在线播放| 亚洲一区二区黄| 少妇久久久久久被弄高潮| 在线亚洲欧美| 亚洲www在线观看| 青青免费在线视频| 亚洲免费av观看| 777米奇影视第四色| www.久久久久爱免| 国产视频亚洲视频| 久久久久成人网站| 极品av少妇一区二区| 国产精品成人国产乱一区| 亚洲中文一区二区| 丁香一区二区三区| 精品国产乱码久久久久| 色欧美激情视频在线| 亚洲成人av一区| 中文字幕 日韩 欧美| 日韩三区视频| 久久99精品国产99久久6尤物| 久久艹精品视频| 99香蕉国产精品偷在线观看 | 午夜影院在线观看国产主播| 欧美精品亚洲二区| 在线不卡av电影| 日韩午夜免费| 99re在线| 麻豆tv入口在线看| 欧美亚洲高清一区| 国产精品jizz| 亚洲青色在线| caoporn国产精品免费公开| 欧美私人网站| 亚洲一二三四久久| 992kp免费看片| 日韩欧美一区二区三区免费看| 久久久精品一区二区三区| 国产精品久久久久久久久夜色| 精品在线视频一区| 亚洲成人午夜在线| 欧美性受ⅹ╳╳╳黑人a性爽| 欧美日韩免费在线观看| 日本www.色| 综合亚洲色图| **欧美日韩vr在线| 欧美一区二区公司| 婷婷综合五月天| 亚洲激情 欧美| 第九色区aⅴ天堂久久香| 青青草国产精品一区二区| 色婷婷av一区二区三| 亚洲国产中文字幕| 久久久久无码国产精品一区李宗瑞| 国产麻豆精品久久| 国产91色在线|免| 国际av在线| 91久久久免费一区二区| 折磨小男生性器羞耻的故事| 国产精品theporn| 动漫一区二区在线| heyzo中文字幕在线| 亚洲精品一区二区三区精华液| 刘亦菲国产毛片bd| 亚洲一区二区三区高清不卡| 成人中文字幕在线观看| 成人在线网址| 亚洲国产99精品国自产| 国产超碰人人爽人人做人人爱| 国产原创一区二区| 亚洲国产精品综合| 国产成人免费av一区二区午夜| 亚洲美女喷白浆| 中文字幕乱码在线观看| √…a在线天堂一区| 女同性αv亚洲女同志| 亚洲人成在线影院| 日本一区二区三区视频在线播放| 日韩av毛片| 日韩高清免费在线| 天天天天天天天干| 99re这里只有精品6| 黄色成人在线看| 精品91自产拍在线观看一区| 国产成人免费观看视频| 国产欧美视频在线观看| 91丝袜超薄交口足| 激情自拍一区| 色噜噜狠狠一区二区三区| 亚洲欧美一级| 韩国精品美女www爽爽爽视频| 国产乱码久久久| 亚洲一区二区视频在线| 日本r级电影在线观看| 午夜日韩福利| 欧美lavv| 欧州一区二区三区| 欧美性在线视频| huan性巨大欧美| 日韩精品极品在线观看播放免费视频 | 亚洲天堂免费视频| 国产乱码精品一区二区三区精东| 国产精品国产精品国产专区不片| 尤蜜粉嫩av国产一区二区三区| 精品国产一区一区二区三亚瑟| 日本免费在线精品| av中文字幕在线观看| 亚洲日韩欧美视频| 亚洲黄色一级大片| 欧美私模裸体表演在线观看| 精品少妇久久久| 中文字幕一区在线观看| 黄色a一级视频| 国产成人在线看| 国产日韩亚洲欧美在线| 欧美顶级毛片在线播放| 欧美又大又硬又粗bbbbb| 亚洲综合影视| 日韩在线小视频| av中文字幕第一页| 欧美在线免费视屏| 可以免费看的av毛片| 亚洲精品乱码久久久久久黑人| 娇妻高潮浓精白浆xxⅹ| 麻豆精品久久久| 99热成人精品热久久66| 日本欧美视频| 久久久福利视频| 久久亚洲资源中文字| 欧美专区日韩视频| 超级白嫩亚洲国产第一| 精品中文字幕乱| 免费一级在线观看| 亚洲精品videossex少妇| 精品人妻无码一区二区三区蜜桃一| 亚洲国产中文字幕| 欧美黄片一区二区三区| 日韩毛片一二三区| 欧美一区二区三区观看| 久久久av毛片精品| 成人午夜剧场视频网站| 激情综合色丁香一区二区| 日韩av中文字幕第一页| 欧美暴力喷水在线| 女女同性女同一区二区三区按摩| 久久精品色播| 国产嫩草一区二区三区在线观看| 欧美一区二区三区成人片在线| 日韩欧美aaa| 日韩久久精品视频| 偷偷要91色婷婷| 伊人手机在线视频| 狠狠躁夜夜躁人人躁婷婷91 | 一区二区国产盗摄色噜噜| 久久国产高清视频| 亚洲视频资源在线| 91嫩草丨国产丨精品| 亚洲欧美日韩中文字幕一区二区三区 | 996这里只有精品| 亚洲+变态+欧美+另类+精品| 91久久夜色精品国产网站| 91精品国产一区二区在线观看| 欧美又大又硬又粗bbbbb| 国产日韩电影| 久久久久久18| a在线视频v视频| 国产91|九色| 91精品影视| 91精品国产综合久久久久久久久| 亚洲天堂免费电影| 国产z一区二区三区| 成人精品国产| 亚洲精品欧美极品| 国产伦精品一区二区三区在线播放| 91久久精品国产91性色| 日韩精品一区二区三区中文在线 | 亚洲欧美综合另类| 在线观看一区二区精品视频| 真实的国产乱xxxx在线91| 777亚洲妇女| 成人a v视频| 欧美小视频在线观看| 国产精品成人无码| 91精品国产综合久久精品图片 | 超碰97网站| 免费成人av| 老汉色影院首页| 国产午夜精品一区二区三区欧美 | a资源在线观看| 亚洲激情第一区| 日本三级小视频| 欧美日韩国产一级| 日本精品999| 一本一本久久a久久精品牛牛影视| 男人天堂亚洲二区| 亚洲美女中文字幕| 好吊日视频在线观看| 国产91|九色| 日韩高清二区| 日韩一区免费观看| 亚洲一本视频| 色婷婷.com| 91片在线免费观看| 少妇人妻丰满做爰xxx| 亚洲精品免费视频| 天堂网一区二区| 欧美视频日韩视频在线观看| 国内精品久久久久久久久久久| 欧美一级视频精品观看| 欧美日韩在线中文字幕| 欧美老妇交乱视频| 成人午夜毛片| 欧美极品一区二区| 国产精品99免费看| 亚洲精品午夜在线观看| 91小视频免费看| 欧美激情国产精品免费| 欧美日韩一区在线| 精品999视频| 久久香蕉频线观| 成人日韩在线| 久久久com| 亚洲黄色影片| 亚洲精品久久久久久| 国产精品免费丝袜| 99超碰在线观看| 亚洲电影在线观看| 青青青国内视频在线观看软件| 欧美一区二区三区免费视| 国产精品久久久久久吹潮| 亚洲free性xxxx护士白浆| 欧美电影免费| 在线观看免费成人av| 久久精品无码一区二区三区| 精品成人久久久| 亚洲第一色在线| eeuss影院在线播放| 欧美国产精品人人做人人爱| 五月天色综合| 亚洲制服中文| 看片网站欧美日韩| 又嫩又硬又黄又爽的视频| 91成人免费在线| 韩国福利在线| 国产精品久久久久77777| 精品国产一区二区三区小蝌蚪| 亚洲av综合色区| 久99久精品视频免费观看| 国产馆在线观看| 欧美精品在欧美一区二区少妇| 日韩av免费观影| 欧美在线激情网| 最新精品国偷自产在线| av在线无限看| 中文字幕成人网| 一本色道久久综合熟妇| 久久躁狠狠躁夜夜爽| 国产亚洲亚洲国产一二区| 青草全福视在线| 懂色av一区二区三区免费看| 国产一级aa大片毛片| 亚洲精品福利在线| 超碰一区二区| 亚洲精品一品区二品区三品区 | 伊人网免费视频| 日韩专区中文字幕| 99精品国产九九国产精品| 色哺乳xxxxhd奶水米仓惠香| 国产成人av影院| www中文在线| 在线视频你懂得一区| 97在线观看免费观看高清| 91久久久久久久久久久久久| 国内精品久久久久久久影视蜜臀 | 久久一区二区三区四区| 国产亚洲第一页| 3751色影院一区二区三区| 亚洲按摩av| 久久偷看各类wc女厕嘘嘘偷窃| 欧美久久成人| 91精品小视频| 欧美性猛交xxxx乱大交退制版| 青青草在线视频免费观看| 国产精品天天狠天天看| 亚洲精品91| 中文字幕日韩三级片| 天天综合色天天| www.亚洲免费| www久久99| 日韩电影在线看| 成人免费看片98| 国产亚洲精品美女久久久| 免费亚洲电影| 日本午夜精品电影| 国产成人综合在线| 亚洲欧美一二三区| 九色精品免费永久在线| 一区三区在线欧| 国产精品嫩草69影院| 在线免费观看成人短视频| 手机av免费在线| 日韩一区二区电影在线观看| 成人动漫一区二区| 中文字幕在线观看精品| 66m—66摸成人免费视频| 欧美91在线| 国产福利一区视频| 中文字幕免费不卡|