成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發
隨著物聯網的興起,在嵌入式設備上,也需要開始使用json進行數據傳輸,那么,如何快速簡潔地用C語言進行json的序列化和反序列化呢?

前言

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

CSON使用實例

(1) 聲明結構體:

/** 項目結構體 */
struct project
{
    int id;
    char *name;
};

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

(2) 定義數據模型:

對每一個需要使用cson的結構體,都需要定義相對應的數據模型

/** 項目結構體數據模型 */
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解析:

只需要定義好數據模型,就可以使用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);

    /** 釋放結構體對象 */
    csonFree(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));

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

運行結果:

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

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

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

2020-07-21 15:20:20

語言結構體共用體

2023-07-29 15:03:29

2010-01-21 16:24:02

C++語言

2021-04-20 09:00:48

Go 語言結構體type

2010-01-25 15:09:17

C++語言

2009-08-14 11:05:28

C#語言的結構體

2020-12-14 06:43:02

并發編程JDK

2015-08-03 09:36:01

賽迪翻譯

2015-08-31 09:27:21

語言界面UI

2018-06-21 14:20:24

Linuxfindfd

2014-02-10 15:05:37

C語言封裝

2014-03-19 15:41:21

編程語言編程規則

2013-06-26 10:13:32

C語言結構體結構體偏移

2010-12-30 09:22:58

C語言 數組

2022-08-19 14:38:52

C語言結構體struct

2021-12-09 15:37:50

自動駕駛數據人工智能

2020-03-30 09:22:36

C語言結構體

2021-11-15 06:56:46

Go語言Tag

2023-07-18 18:10:04

2020-05-19 17:07:09

Spark測試數據計算
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人国产精品免费观看 | 国产欧美一区二区三区国产幕精品 | 一区二区三区在线 | 91一区二区三区在线观看 | 亚洲国产精品成人久久久 | 亚洲精选一区二区 | 日本在线黄色 | 亚洲欧洲小视频 | 欧美在线精品一区 | 日韩a视频| 亚洲午夜视频在线观看 | 免费的色网站 | 一级片免费网站 | 精品国产一区二区三区性色av | 欧美日产国产成人免费图片 | 久久国产成人午夜av影院武则天 | 久久久九九九九 | 国产精品毛片无码 | 日韩中文一区二区三区 | 日韩成人精品 | 中文字幕日韩欧美一区二区三区 | 一区二区三区亚洲精品国 | 另类专区成人 | 欧美一级黑人aaaaaaa做受 | 精品一区av | 久久精品久久精品久久精品 | 国产欧美一区二区三区在线播放 | 中文字字幕一区二区三区四区五区 | 亚洲精选久久 | 九色网址 | 羞羞视频在线观看免费观看 | 欧美精品一区二区三区在线四季 | 免费国产一区 | 日日噜噜噜夜夜爽爽狠狠视频, | 久久久久国产 | 在线观看国产视频 | 国产精品欧美一区喷水 | 日韩午夜影院 | 午夜精品一区二区三区免费视频 | 二区在线视频 | 天堂成人av|