日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

struct2json API 文档,s2j库(c语言与json互转)

發(fā)布時間:2024/3/13 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 struct2json API 文档,s2j库(c语言与json互转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

struct2json API 文檔


所有支持的API接口都在 \struct2json\inc\s2j.h 中聲明。以下內(nèi)容較多,建議使用 CTRL+F 搜索。

1、用戶使用接口

1.1 初始化

初始化的struct2json庫。

注:目前主要初始化該庫及cJSON庫所需的內(nèi)存管理方法。默認(rèn)使用的 malloc 及 free 作為內(nèi)存管理方法,如果使用默認(rèn)內(nèi)存管理方式,則無需初始化。

void s2j_init(S2jHook *hook) 參數(shù)描述
hook指定的內(nèi)存管理方法

1.2 將結(jié)構(gòu)體對象轉(zhuǎn)換(序列化)為JSON對象

注意:以下API均采用宏定義方式,在使用時與常用API方法形式略有不同,請注意查看Demo。

1.2.1 創(chuàng)建JSON對象

s2j_create_json_obj(json_obj) 參數(shù)描述
json_objJSON對象

1.2.2 轉(zhuǎn)換基本類型元素

注意:這里的結(jié)構(gòu)體元素基本類型只支持 int 、 string 及 double ,其他類型轉(zhuǎn)換時應(yīng)考慮選取三者中的其中一種作目標(biāo)類型,選擇標(biāo)準(zhǔn)為兩者類型間可被無損相互轉(zhuǎn)換。例如:結(jié)構(gòu)體元素類型為 uint8_t 、uint16_t 、int16_t 、 size_t 、某指針地址 等類型可以選擇 int 作為入?yún)ⅰ?/p> s2j_json_set_basic_element(to_json, from_struct, type, element)

參數(shù)描述
to_json目標(biāo)JSON對象
from_struct源結(jié)構(gòu)體對象
type源結(jié)構(gòu)體對象元素類型,這里只支持int、string、double
element源結(jié)構(gòu)體對象元素

1.2.3 轉(zhuǎn)換數(shù)組類型元素

s2j_json_set_array_element(to_json, from_struct, type, element, size) 參數(shù)描述
to_json目標(biāo)JSON對象
from_struct源結(jié)構(gòu)體對象
type源結(jié)構(gòu)體對象元素的基本類型。參考1.2.2中對基本類型的要求
element源結(jié)構(gòu)體對象元素
size源結(jié)構(gòu)體對象數(shù)組元素的長度

1.2.4 轉(zhuǎn)換結(jié)構(gòu)體類型元素(即子結(jié)構(gòu)體)

s2j_json_set_struct_element(child_json, to_json, child_struct, from_struct, type, element) 參數(shù)描述
child_json目標(biāo)JSON對象的子JSON對象
to_json目標(biāo)JSON對象
child_struct源結(jié)構(gòu)體對象的子結(jié)構(gòu)體對象
from_struct源結(jié)構(gòu)體對象
type源結(jié)構(gòu)體對象元素(子結(jié)構(gòu)體)類型
element源結(jié)構(gòu)體對象元素

例子:

typedef struct {char name[16]; } Hometown;typedef struct {uint8_t id;char name[10];Hometown hometown; } Student;Student orignal_struct_student = {.id = 24,.name = "armink",.hometown.name = "China", } Student *struct_student = &orignal_struct_student; /* 創(chuàng)建空Student JSON對象 */ s2j_create_json_obj(json_student); /* 序列化(轉(zhuǎn)換)Student結(jié)構(gòu)體的id元素 */ s2j_json_set_basic_element(json_student, struct_student, int, id); /* 序列化Student結(jié)構(gòu)體的name元素 */ s2j_json_set_basic_element(json_student, struct_student, string, name); /* 序列化Student結(jié)構(gòu)體的子結(jié)構(gòu)體hometown元素 */ s2j_json_set_struct_element(json_hometown, json_student, struct_hometown, struct_student, Hometown, hometown); /* 序列化Hometown結(jié)構(gòu)體的name元素 */ s2j_json_set_basic_element(json_hometown, struct_hometown, string, name);

1.3 將JSON對象轉(zhuǎn)換(反序列化)為結(jié)構(gòu)體對象

1.3.1 創(chuàng)建結(jié)構(gòu)體對象

s2j_create_struct_obj(struct_obj, type) 參數(shù)描述
struct_obj結(jié)構(gòu)體對象
type結(jié)構(gòu)體類型

1.3.2 轉(zhuǎn)換基本類型元素

s2j_struct_get_basic_element(to_struct, from_json, type, element) 參數(shù)描述
to_struct目標(biāo)結(jié)構(gòu)體對象
from_json源JSON對象
type目標(biāo)結(jié)構(gòu)體對象元素類型。參考1.2.2中對基本類型的要求
element目標(biāo)結(jié)構(gòu)體對象元素

1.3.3 轉(zhuǎn)換數(shù)組類型元素

s2j_struct_get_array_element(to_struct, from_json, type, element) 參數(shù)描述
to_struct目標(biāo)結(jié)構(gòu)體對象
from_json源JSON對象
type目標(biāo)結(jié)構(gòu)體對象元素類型。參考1.2.2中對基本類型的要求
element目標(biāo)結(jié)構(gòu)體對象元素

1.3.4 轉(zhuǎn)換結(jié)構(gòu)體類型元素(即子JSON)

s2j_struct_get_struct_element(child_struct, to_struct, child_json, from_json, type, element) 參數(shù)描述
child_struct目標(biāo)結(jié)構(gòu)體對象的子結(jié)構(gòu)體對象
to_struct目標(biāo)結(jié)構(gòu)體對象
child_json源JSON對象的子JSON對象
from_json源JSON對象
type源JSON對象元素(子JSON)類型
element源JSON對象元素

例子:

typedef struct {char name[16]; } Hometown;typedef struct {uint8_t id;char name[10];Hometown hometown; } Student;char orignal_json_string_student[] = "{\"id\":24, \"name\":\"armink\", \"hometown\":{\"name\":\"China\"}}"; /* 創(chuàng)建Student JSON對象 */ cJSON *json_student = cJSON_Parse(orignal_json_string_student); /* 創(chuàng)建空Student結(jié)構(gòu)體對象 */ s2j_create_struct_obj(struct_student, Student); /* 反序列化Student結(jié)構(gòu)體的id元素 */ s2j_struct_get_basic_element(struct_student, json_student, int, id); /* 反序列化Student結(jié)構(gòu)體的name元素 */ s2j_struct_get_basic_element(struct_student, json_student, string, name); /* 反序列化Student結(jié)構(gòu)體的子結(jié)構(gòu)體hometown元素 */ s2j_struct_get_struct_element(struct_hometown, struct_student, json_hometown, json_student, Hometown, hometown); /* 反序列化Hometown結(jié)構(gòu)體的name元素 */ s2j_struct_get_basic_element(struct_hometown, json_hometown, string, name);

2、注意

  • 該庫只適用于C99及其以上標(biāo)準(zhǔn)編譯器

C結(jié)構(gòu)體與 JSON 快速互轉(zhuǎn)庫


struct2json

struct2json 是一個開源的C結(jié)構(gòu)體與 JSON 快速互轉(zhuǎn)庫,它可以快速實(shí)現(xiàn) 結(jié)構(gòu)體對象JSON 對象 之間序列化及反序列化要求。快速、簡潔的 API 設(shè)計(jì),大大降低直接使用 JSON 解析庫來實(shí)現(xiàn)此類功能的代碼復(fù)雜度。

起源

把面向?qū)ο笤O(shè)計(jì)應(yīng)用到C語言中,是當(dāng)下很流行的設(shè)計(jì)思想。由于C語言中沒有類,所以一般使用結(jié)構(gòu)體 struct 充當(dāng)類,那么結(jié)構(gòu)體變量就是對象。有了對象之后,很多時候需要考慮對象的序列化及反序列化問題。C語言不像很多高級語言擁有反射等機(jī)制,使得對象序列化及反序列化被原生的支持。

對于C語言來說,序列化為 JSON 字符串是個不錯的選擇,所以就得使用 cJSON 這類 JSON 解析庫,但是使用后的代碼冗余且邏輯性差,所以萌生對cJSON庫進(jìn)行二次封裝,實(shí)現(xiàn)一個 struct 與 JSON 之間快速互轉(zhuǎn)的庫。 struct2json 就誕生于此。下面是 struct2json 主要使用場景:

  • 持久化 :結(jié)構(gòu)體對象序列化為 JSON 對象后,可直接保存至文件、Flash,實(shí)現(xiàn)對結(jié)構(gòu)體對象的掉電存儲;
  • 通信 :高級語言對JSON支持的很友好,例如: Javascript、Groovy 就對 JSON 具有原生的支持,所以 JSON 也可作為C語言與其他語言軟件之間的通信協(xié)議格式及對象傳遞格式;
  • 可視化 :序列化為 JSON 后的對象,可以更加直觀的展示到控制臺或者 UI 上,可用于產(chǎn)品調(diào)試、產(chǎn)品二次開發(fā)等場景;

如何使用

聲明結(jié)構(gòu)體

如下聲明了兩個結(jié)構(gòu)體,結(jié)構(gòu)體 Hometown 是結(jié)構(gòu)體 Student 的子結(jié)構(gòu)體

/* 籍貫 */ typedef struct {char name[16]; } Hometown;/* 學(xué)生 */ typedef struct {uint8_t id;uint8_t score[8];char name[10];double weight;Hometown hometown; } Student;

將結(jié)構(gòu)體對象序列化為 JSON 對象

使用前(源文件)使用后(源文件)

將 JSON 對象反序列化為結(jié)構(gòu)體對象

使用前(源文件)使用后(源文件)

V2.0版本新增功能【yuxuebao】

1) 更新cJSON庫至1.7.12版本,并擴(kuò)充實(shí)現(xiàn),支持int64 (long long)類型數(shù)據(jù)。PS:cJSON原來int64類型以double方式處理,如果超過16位會有精度損失。

2) 擴(kuò)展struct2json功能,增加支持結(jié)構(gòu)體內(nèi)包含結(jié)構(gòu)體成員,支持包含數(shù)組成員。

3) 增加struct2json 結(jié)構(gòu)體與JSON轉(zhuǎn)換代碼自動生成的Python腳本,支持從頭文件中提取結(jié)構(gòu)體定義,并根據(jù)結(jié)構(gòu)體定義自動生成結(jié)構(gòu)體與JSON互轉(zhuǎn)代碼,并提供相關(guān)示例。

V2.0 使用說明:

1) 提取結(jié)構(gòu)體定義:

將頭文件(eg:mc_usr_def.h)放在demo\inc目錄下;執(zhí)行g(shù)enerate_struct_defination.py,生成struct_defination.txt;

2) 生成結(jié)構(gòu)體與JSON互轉(zhuǎn)代碼:

執(zhí)行g(shù)enerate_s2j_code.py,根據(jù)結(jié)構(gòu)體定義自動生成結(jié)構(gòu)體與JSON互轉(zhuǎn)代碼:my_struct_2_json.c,my_struct_2_json.h;該腳本支持的參數(shù)類型有 基本類型 和 結(jié)構(gòu)體類型,enum和指針按int處理,不支持union和位域;支持的數(shù)組類型:支持基本類型一維數(shù)組,結(jié)構(gòu)體一維數(shù)組,字符二維數(shù)組(字符串?dāng)?shù)組)

3) 測試結(jié)構(gòu)體與JSON轉(zhuǎn)換:

cd demo編譯測試代碼,gcc ../cJSON/cJSON.c ../struct2json/src/*.c ./*.c -I ../cJSON/ -I ../struct2json/inc/ -lm -DDEBUGS2J -g -o tests2j測試 ./tests2j 查看output輸出和生成的JSON樣例文件struct_defination.json;預(yù)期輸出:*:strcmp:0 *:strcmp:0

*:json_cmp:1

歡迎大家 fork and pull request(Github|OSChina|Coding) 。如果覺得這個開源項(xiàng)目很贊,可以點(diǎn)擊項(xiàng)目主頁 右上角的Star,同時把它推薦給更多有需要的朋友。

文檔

具體內(nèi)容參考\docs\zh\下的文件。務(wù)必保證在 閱讀文檔 后再使用。

許可

  • Armink (original author)
  • Yu Xuebao (current maintainer)
  • and the other contributors (CONTRIBUTORS.md)

MIT Copyright ? armink.ztl@gmail.com

總結(jié)

以上是生活随笔為你收集整理的struct2json API 文档,s2j库(c语言与json互转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。