色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用C語(yǔ)言進(jìn)行json的序列化和反序列化

麥辣雞腿堡 ? 來(lái)源:CSDN博客 ? 作者:NevermindZZT ? 2023-10-07 11:05 ? 次閱讀

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解析庫(kù)當(dāng)屬cJSON,但是,使用cJSON讀json進(jìn)行序列化和反序列化,需要根據(jù)key一個(gè)一個(gè)進(jìn)行處理,會(huì)導(dǎo)致代碼冗余,邏輯性不強(qiáng),哪有沒(méi)有更好的方法呢?

思路

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ì)象幾乎是不可能的。

怎么解決呢,既然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)體中的偏移。

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

實(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ì)象的映射。

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

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)存空間。

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

struct project
{
    int id;
    char *name;
}

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

{.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)行解析。

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

*(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源碼。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7085

    瀏覽量

    89202
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7608

    瀏覽量

    137135
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3268

    瀏覽量

    48925
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    119

    瀏覽量

    6981
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用Serde進(jìn)行序列化反序列化

    Serde 是一個(gè)用于序列化反序列化 Rust 數(shù)據(jù)結(jié)構(gòu)的庫(kù)。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化反序列化
    的頭像 發(fā)表于 09-30 17:09 ?1308次閱讀

    Java序列化的機(jī)制和原理

    對(duì)象的序列化反序列化也算是Java基礎(chǔ)的一部分,下面對(duì)Java序列化的機(jī)制和原理進(jìn)行一些介紹。Java序列化算法透析Serializati
    發(fā)表于 07-10 07:27

    Virtex ISERDES_NODELAY對(duì)快速4線總線進(jìn)行反序列化怎么實(shí)現(xiàn)?

    你好朋友。我想使用Virtex ISERDES_NODELAY對(duì)快速4線總線進(jìn)行反序列化。總線大約為700 MHz。我想確保反序列化的信號(hào)不是異相的。我的意思是,如果其中一個(gè)ISERDES由于內(nèi)部路由延遲而稍后將復(fù)位,則
    發(fā)表于 06-01 16:54

    c語(yǔ)言序列化反序列化有何區(qū)別

    這里寫(xiě)自定義目錄標(biāo)題c語(yǔ)言序列化反序列化tplut.htplut.c測(cè)試代碼參考c
    發(fā)表于 07-14 07:32

    關(guān)于c語(yǔ)言序列化反序列化的知識(shí)點(diǎn)看完你就懂了

    關(guān)于c語(yǔ)言序列反序列化的知識(shí)點(diǎn)你就懂了
    發(fā)表于 10-15 08:47

    SpringMVC JSON框架的自定義序列化反序列化

    自定義序列化改造,但沒(méi)有提供反序列化過(guò)濾器,來(lái)實(shí)現(xiàn)對(duì)應(yīng)的功能。方案:@JSONField注解回到對(duì)JSON報(bào)文String類(lèi)型的值執(zhí)行trim操作,官網(wǎng)支持@JSONField注解的屬性設(shè)置(要求
    發(fā)表于 10-10 16:02

    理解PHP反序列化漏洞

    理解PHP反序列化漏洞
    發(fā)表于 09-07 11:03 ?7次下載
    理解PHP<b class='flag-5'>反序列化</b>漏洞

    java序列化反序列化范例和JDK類(lèi)庫(kù)中的序列化API

    一、序列化反序列化的概念 把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱(chēng)為對(duì)象的序列化。 把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱(chēng)為對(duì)象的
    發(fā)表于 09-27 10:13 ?6次下載

    static屬性為什么不會(huì)被序列化

    實(shí)現(xiàn)序列化反序列化為什么要實(shí)現(xiàn)Serializable接口?
    的頭像 發(fā)表于 07-15 11:03 ?1775次閱讀

    C#實(shí)現(xiàn)對(duì)象序列化的三種方式是什么

    很多小伙伴一提到序列化,都會(huì)想到二進(jìn)制序列化,但其實(shí)序列化并不僅僅只是二進(jìn)制序列化,我們常說(shuō)的對(duì)象序列化有三種方式,分別是二進(jìn)制
    的頭像 發(fā)表于 02-22 16:11 ?1218次閱讀
    <b class='flag-5'>C</b>#實(shí)現(xiàn)對(duì)象<b class='flag-5'>序列化</b>的三種方式是什么

    什么是序列化 為什么要序列化

    什么是序列化? “序列化”(Serialization )的意思是將一個(gè)對(duì)象轉(zhuǎn)化為字節(jié)流。 這里說(shuō)的對(duì)象可以理解為“面向?qū)ο蟆崩锏哪莻€(gè)對(duì)象,具體的就是存儲(chǔ)在內(nèi)存中的對(duì)象數(shù)據(jù)。 與之相反的過(guò)程是“反序列化
    的頭像 發(fā)表于 09-14 17:22 ?2604次閱讀
    什么是<b class='flag-5'>序列化</b> 為什么要<b class='flag-5'>序列化</b>

    ROS中的序列化實(shí)現(xiàn)

    理解了序列化,再回到ROS。我們發(fā)現(xiàn),ROS沒(méi)有采用第三方的序列化工具,而是選擇自己實(shí)現(xiàn),代碼在roscpp_core項(xiàng)目下的roscpp_serialization中,見(jiàn)下圖。這個(gè)功能涉及的代碼量
    的頭像 發(fā)表于 09-14 17:26 ?928次閱讀

    Spring Boot時(shí)配置JSON序列化選項(xiàng)的幾種方法

    在Spring Boot Web 項(xiàng)目中,當(dāng)使用JSON格式接收數(shù)據(jù)和返回?cái)?shù)據(jù)的時(shí)候,Spring Boot 默認(rèn)使用一個(gè)ObjectMapper實(shí)例來(lái)序列化響應(yīng)和反序列化請(qǐng)求。 在本文中,我們將
    的頭像 發(fā)表于 10-09 10:26 ?2236次閱讀

    Java序列化怎么使用

    轉(zhuǎn)換方式就叫做序列化。將文件或者網(wǎng)絡(luò)傳輸中得到的 byte[] 數(shù)組轉(zhuǎn)換為 java 對(duì)象就叫做反序列化。 怎么使用 如果一個(gè) Java 對(duì)象要能被序列化,必須實(shí)現(xiàn)一個(gè)特殊
    的頭像 發(fā)表于 10-10 14:19 ?460次閱讀

    什么時(shí)候需要Boost序列化

    程序開(kāi)發(fā)中,序列化是經(jīng)常需要用到的。像一些相對(duì)高級(jí)語(yǔ)言,比如JAVA, C#都已經(jīng)很好的支持了序列化,那么C++呢?當(dāng)然一個(gè)比較好的選擇就是
    的頭像 發(fā)表于 11-10 10:14 ?433次閱讀
    主站蜘蛛池模板: 灌满内射HP1V1| 思思99精品国产自在现线| 男男腐文污高干嗯啊快点1V1| 免费果冻传媒2021在线观看| 日韩欧美1区| 亚洲免费视频观看| 99久酒店在线精品2019| 国产国产成人人免费影院| 九九热在线观看| 强壮的公次次弄得我高潮韩国电影| 少妇邻居内射在线| 一区二区三区福利视频| 被免费网站在线视频| 精品国产午夜福利在线观看蜜月| 欧美14videosex性欧美成人| 午夜免费福利小电影| 3D漫画H精品啪啪无码| 国产精品99久久久久久AV蜜臀| 久久三级视频| 特大黑人娇小亚洲女mp4| 在线看片福利无码网址| 国产av在线看的| 麻豆高潮AV久久久久久久| 无码中文字幕av免费放| 97午夜伦伦电影理论片| 国产午夜三区视频在线| 欧洲老妇人bb| 伊人影院2019| 国产精品看高国产精品不卡| 男男高h浪荡受h| 亚洲欧洲自拍偷拍| 丰满少妇发泄14p| 免费成人高清在线视频| 亚洲精品久久久久久偷窥| 成人免费精品视频| 巨黄的肉辣文np| 亚洲 欧美 制服 校园 动漫| 被窝伦理午夜电影网| 浪潮AV色综合久久天堂| 亚洲国产黄色| 姑娘视频日本在线播放|