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

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

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

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

前言

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

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

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

思路

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

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

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

實現

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

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

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

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

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

struct project{    int id;    char *name;}

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

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

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

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

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

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

CSON使用實例

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

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

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

對每一個需要使用cson的結構體,都需要定義相對應的數據模型Ipi28資訊網——每日最新資訊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解析:Ipi28資訊網——每日最新資訊28at.com

只需要定義好數據模型,就可以使用CSON讀json進行序列化和反序列化Ipi28資訊網——每日最新資訊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);}

運行結果:Ipi28資訊網——每日最新資訊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的情況下,你可能需要多次判斷,解析元素。Ipi28資訊網——每日最新資訊28at.com

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

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

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

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

標簽:
  • 熱門焦點
  • 一加Ace2 Pro官宣:普及16G內存 引領24G

    一加官方今天繼續為本月發布的新機一加Ace2 Pro帶來預熱,公布了內存方面的信息?!疤蕴?8GB ,12GB 起步,16GB 普及,24GB 引領,還有呢?#一加Ace2Pro#,2023 年 8 月,敬請期待?!蓖瑫r
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據今天鴻蒙OS 4.0的現場演示顯示,華為的實況窗可以更高效的展現出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網課,網課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點就是停滯的這幾年行業又有了新的發展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • 服務存儲設計模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數據從主存儲加載到KV緩存中,加速后續的訪問。在存在重復度的場景,Cache-Aside可以提升服務性能,降低底層存儲的壓力,缺點是緩存和底
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • 網紅炒股不為了賺錢,那就是耍流氓!

    來源:首席商業評論6月26日高調宣布入市,網絡名嘴大v胡錫進居然進軍了股市。在一次財經媒體峰會上,幾個財經圈媒體大佬就&ldquo;胡錫進炒股是否知道認真報道&rdquo;展開討論。有
  • Counterpoint :OPPO雙旗艦戰略全面落地 高端產品銷量增長22%

    2023年6月30日,全球行業分析機構Counterpoint Research發布的《中國智能手機高端市場白皮書》顯示,中國智能手機品牌正在尋求高質量發展,中國高端智能
Top 主站蜘蛛池模板: 凤凰县| 榆中县| 前郭尔| 宁波市| 旅游| 乌兰县| 嵊州市| 获嘉县| 新河县| 遵义市| 河间市| 尼玛县| 定州市| 漳州市| 奇台县| 武安市| 永清县| 瓦房店市| 高要市| 宁都县| 博爱县| 崇义县| 五台县| 洪泽县| 射阳县| 平遥县| 芮城县| 阳西县| 济宁市| 明水县| 乌兰察布市| 尉犁县| 贡觉县| 突泉县| 疏附县| 北辰区| 循化| 乌审旗| 汉寿县| 乌鲁木齐市| 武胜县|