吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用C語言進行json的序列化和反序列化

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

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

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

思路

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

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

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

實現

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

CSON最基本的數據模型定義如下:

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

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

比如說這樣一個結構體:

struct project
{
    int id;
    char *name;
}

該結構體包含兩個成員,對于成員id,我們使用數據模型對其進行描述

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

對于結構體的每個成員,都進行數據模型的定義,就可以得到一個完整的結構體數據模型,CSON會根據這個模型,進行解析。

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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7139

    瀏覽量

    89578
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137714
  • 模型
    +關注

    關注

    1

    文章

    3305

    瀏覽量

    49221
  • JSON
    +關注

    關注

    0

    文章

    119

    瀏覽量

    7011
收藏 人收藏

    評論

    相關推薦

    如何使用Serde進行序列化反序列化

    Serde 是一個用于序列化反序列化 Rust 數據結構的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化反序列化
    的頭像 發表于 09-30 17:09 ?1378次閱讀

    怎么支持PIC32中的JSON解析和序列化

    我正在尋找支持或庫,允許我將JSON對象序列化為char數組,并將char數組/字符串解析為JSON對象。我查看了JSMN庫,但它看起來只是解析,而不是序列化。我目前在ARDUINO板
    發表于 11-28 16:46

    Java序列化的機制和原理

    對象的序列化反序列化也算是Java基礎的一部分,下面對Java序列化的機制和原理進行一些介紹。Java序列化算法透析Serializati
    發表于 07-10 07:27

    Virtex ISERDES_NODELAY對快速4線總線進行反序列化怎么實現?

    你好朋友。我想使用Virtex ISERDES_NODELAY對快速4線總線進行反序列化??偩€大約為700 MHz。我想確保反序列化的信號不是異相的。我的意思是,如果其中一個ISERDES由于內部路由延遲而稍后將復位,則
    發表于 06-01 16:54

    c語言序列化反序列化有何區別

    這里寫自定義目錄標題c語言序列化反序列化tplut.htplut.c測試代碼參考c
    發表于 07-14 07:32

    關于c語言序列化反序列化的知識點看完你就懂了

    關于c語言序列反序列化的知識點你就懂了
    發表于 10-15 08:47

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

    自定義序列化改造,但沒有提供反序列化過濾器,來實現對應的功能。方案:@JSONField注解回到對JSON報文String類型的值執行trim操作,官網支持@JSONField注解的屬性設置(要求
    發表于 10-10 16:02

    理解PHP反序列化漏洞

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

    java序列化反序列化范例和JDK類庫中的序列化API

    一、序列化反序列化的概念 把對象轉換為字節序列的過程稱為對象的序列化。 把字節序列恢復為對象的過程稱為對象的
    發表于 09-27 10:13 ?6次下載

    static屬性為什么不會被序列化

    實現序列化反序列化為什么要實現Serializable接口?
    的頭像 發表于 07-15 11:03 ?1816次閱讀

    C#實現對象序列化的三種方式是什么

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

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

    什么是序列化? “序列化”(Serialization )的意思是將一個對象轉化為字節流。 這里說的對象可以理解為“面向對象”里的那個對象,具體的就是存儲在內存中的對象數據。 與之相反的過程是“反序列化
    的頭像 發表于 09-14 17:22 ?2675次閱讀
    什么是<b class='flag-5'>序列化</b> 為什么要<b class='flag-5'>序列化</b>

    ROS中的序列化實現

    理解了序列化,再回到ROS。我們發現,ROS沒有采用第三方的序列化工具,而是選擇自己實現,代碼在roscpp_core項目下的roscpp_serialization中,見下圖。這個功能涉及的代碼量
    的頭像 發表于 09-14 17:26 ?961次閱讀

    Spring Boot時配置JSON序列化選項的幾種方法

    在Spring Boot Web 項目中,當使用JSON格式接收數據和返回數據的時候,Spring Boot 默認使用一個ObjectMapper實例來序列化響應和反序列化請求。 在本文中,我們將
    的頭像 發表于 10-09 10:26 ?2289次閱讀

    Java序列化怎么使用

    轉換方式就叫做序列化。將文件或者網絡傳輸中得到的 byte[] 數組轉換為 java 對象就叫做反序列化。 怎么使用 如果一個 Java 對象要能被序列化,必須實現一個特殊
    的頭像 發表于 10-10 14:19 ?484次閱讀
    太阳城娱乐开户| 永利百家乐赌场娱乐网规则| 百家乐的玩法和技巧| 网上百家乐打牌| 贵族娱乐城信誉| 百家乐官网赌博娱乐| 反赌百家乐的玩法技巧和规则| 百家乐官网的赚钱原理| 百家乐包台| 皇冠百家乐官网皇冠网| 百家乐论坛香港马会| 百家乐官网技巧之写路| 百家乐官网专打和局| 赌场百家乐试玩| 百家乐官网能赚大钱吗| 棋牌休闲游戏| 沁阳市| 博彩百家乐官网带连线走势图| 澳门百家乐公试打法| 水果机游戏机遥控器| 昔阳县| 24山安葬择日吉凶| 澳门赌百家乐的玩法技巧和规则| 百家乐官网荷| 百家乐游戏什么时间容易出对| 赌博药| 真人百家乐官网套红利| 百家乐电子游戏试| 博彩太阳城| 怎么玩百家乐官网的玩法技巧和规则| 澳门百家乐新濠天地| 88娱乐城1| 百家乐官网游戏作弊| 百家乐论坛博彩拉| 澳门葡京赌场美女| 喜力百家乐官网的玩法技巧和规则| 可信百家乐的玩法技巧和规则 | 德州百家乐官网扑克牌| 至尊百家乐| 百家乐官网视频游戏中心| 在线百家乐技巧|