struct2json API 文档,s2j库(c语言与json互转)
struct2json API 文檔
所有支持的API接口都在 \struct2json\inc\s2j.h 中聲明。以下內容較多,建議使用 CTRL+F 搜索。
1、用戶使用接口
1.1 初始化
初始化的struct2json庫。
注:目前主要初始化該庫及cJSON庫所需的內存管理方法。默認使用的 malloc 及 free 作為內存管理方法,如果使用默認內存管理方式,則無需初始化。
void s2j_init(S2jHook *hook)| hook | 指定的內存管理方法 |
1.2 將結構體對象轉換(序列化)為JSON對象
注意:以下API均采用宏定義方式,在使用時與常用API方法形式略有不同,請注意查看Demo。
1.2.1 創建JSON對象
s2j_create_json_obj(json_obj)| json_obj | JSON對象 |
1.2.2 轉換基本類型元素
注意:這里的結構體元素基本類型只支持 int 、 string 及 double ,其他類型轉換時應考慮選取三者中的其中一種作目標類型,選擇標準為兩者類型間可被無損相互轉換。例如:結構體元素類型為 uint8_t 、uint16_t 、int16_t 、 size_t 、某指針地址 等類型可以選擇 int 作為入參。
s2j_json_set_basic_element(to_json, from_struct, type, element)| to_json | 目標JSON對象 |
| from_struct | 源結構體對象 |
| type | 源結構體對象元素類型,這里只支持int、string、double |
| element | 源結構體對象元素 |
1.2.3 轉換數組類型元素
s2j_json_set_array_element(to_json, from_struct, type, element, size)| to_json | 目標JSON對象 |
| from_struct | 源結構體對象 |
| type | 源結構體對象元素的基本類型。參考1.2.2中對基本類型的要求 |
| element | 源結構體對象元素 |
| size | 源結構體對象數組元素的長度 |
1.2.4 轉換結構體類型元素(即子結構體)
s2j_json_set_struct_element(child_json, to_json, child_struct, from_struct, type, element)| child_json | 目標JSON對象的子JSON對象 |
| to_json | 目標JSON對象 |
| child_struct | 源結構體對象的子結構體對象 |
| from_struct | 源結構體對象 |
| type | 源結構體對象元素(子結構體)類型 |
| element | 源結構體對象元素 |
例子:
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; /* 創建空Student JSON對象 */ s2j_create_json_obj(json_student); /* 序列化(轉換)Student結構體的id元素 */ s2j_json_set_basic_element(json_student, struct_student, int, id); /* 序列化Student結構體的name元素 */ s2j_json_set_basic_element(json_student, struct_student, string, name); /* 序列化Student結構體的子結構體hometown元素 */ s2j_json_set_struct_element(json_hometown, json_student, struct_hometown, struct_student, Hometown, hometown); /* 序列化Hometown結構體的name元素 */ s2j_json_set_basic_element(json_hometown, struct_hometown, string, name);1.3 將JSON對象轉換(反序列化)為結構體對象
1.3.1 創建結構體對象
s2j_create_struct_obj(struct_obj, type)| struct_obj | 結構體對象 |
| type | 結構體類型 |
1.3.2 轉換基本類型元素
s2j_struct_get_basic_element(to_struct, from_json, type, element)| to_struct | 目標結構體對象 |
| from_json | 源JSON對象 |
| type | 目標結構體對象元素類型。參考1.2.2中對基本類型的要求 |
| element | 目標結構體對象元素 |
1.3.3 轉換數組類型元素
s2j_struct_get_array_element(to_struct, from_json, type, element)| to_struct | 目標結構體對象 |
| from_json | 源JSON對象 |
| type | 目標結構體對象元素類型。參考1.2.2中對基本類型的要求 |
| element | 目標結構體對象元素 |
1.3.4 轉換結構體類型元素(即子JSON)
s2j_struct_get_struct_element(child_struct, to_struct, child_json, from_json, type, element)| child_struct | 目標結構體對象的子結構體對象 |
| to_struct | 目標結構體對象 |
| 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\"}}"; /* 創建Student JSON對象 */ cJSON *json_student = cJSON_Parse(orignal_json_string_student); /* 創建空Student結構體對象 */ s2j_create_struct_obj(struct_student, Student); /* 反序列化Student結構體的id元素 */ s2j_struct_get_basic_element(struct_student, json_student, int, id); /* 反序列化Student結構體的name元素 */ s2j_struct_get_basic_element(struct_student, json_student, string, name); /* 反序列化Student結構體的子結構體hometown元素 */ s2j_struct_get_struct_element(struct_hometown, struct_student, json_hometown, json_student, Hometown, hometown); /* 反序列化Hometown結構體的name元素 */ s2j_struct_get_basic_element(struct_hometown, json_hometown, string, name);2、注意
- 該庫只適用于C99及其以上標準編譯器
C結構體與 JSON 快速互轉庫
struct2json
struct2json 是一個開源的C結構體與 JSON 快速互轉庫,它可以快速實現 結構體對象 與 JSON 對象 之間序列化及反序列化要求。快速、簡潔的 API 設計,大大降低直接使用 JSON 解析庫來實現此類功能的代碼復雜度。
起源
把面向對象設計應用到C語言中,是當下很流行的設計思想。由于C語言中沒有類,所以一般使用結構體 struct 充當類,那么結構體變量就是對象。有了對象之后,很多時候需要考慮對象的序列化及反序列化問題。C語言不像很多高級語言擁有反射等機制,使得對象序列化及反序列化被原生的支持。
對于C語言來說,序列化為 JSON 字符串是個不錯的選擇,所以就得使用 cJSON 這類 JSON 解析庫,但是使用后的代碼冗余且邏輯性差,所以萌生對cJSON庫進行二次封裝,實現一個 struct 與 JSON 之間快速互轉的庫。 struct2json 就誕生于此。下面是 struct2json 主要使用場景:
- 持久化 :結構體對象序列化為 JSON 對象后,可直接保存至文件、Flash,實現對結構體對象的掉電存儲;
- 通信 :高級語言對JSON支持的很友好,例如: Javascript、Groovy 就對 JSON 具有原生的支持,所以 JSON 也可作為C語言與其他語言軟件之間的通信協議格式及對象傳遞格式;
- 可視化 :序列化為 JSON 后的對象,可以更加直觀的展示到控制臺或者 UI 上,可用于產品調試、產品二次開發等場景;
如何使用
聲明結構體
如下聲明了兩個結構體,結構體 Hometown 是結構體 Student 的子結構體
/* 籍貫 */ typedef struct {char name[16]; } Hometown;/* 學生 */ typedef struct {uint8_t id;uint8_t score[8];char name[10];double weight;Hometown hometown; } Student;將結構體對象序列化為 JSON 對象
將 JSON 對象反序列化為結構體對象
V2.0版本新增功能【yuxuebao】
1) 更新cJSON庫至1.7.12版本,并擴充實現,支持int64 (long long)類型數據。PS:cJSON原來int64類型以double方式處理,如果超過16位會有精度損失。
2) 擴展struct2json功能,增加支持結構體內包含結構體成員,支持包含數組成員。
3) 增加struct2json 結構體與JSON轉換代碼自動生成的Python腳本,支持從頭文件中提取結構體定義,并根據結構體定義自動生成結構體與JSON互轉代碼,并提供相關示例。
V2.0 使用說明:
1) 提取結構體定義:
將頭文件(eg:mc_usr_def.h)放在demo\inc目錄下;執行generate_struct_defination.py,生成struct_defination.txt;2) 生成結構體與JSON互轉代碼:
執行generate_s2j_code.py,根據結構體定義自動生成結構體與JSON互轉代碼:my_struct_2_json.c,my_struct_2_json.h;該腳本支持的參數類型有 基本類型 和 結構體類型,enum和指針按int處理,不支持union和位域;支持的數組類型:支持基本類型一維數組,結構體一維數組,字符二維數組(字符串數組)3) 測試結構體與JSON轉換:
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;預期輸出:*:strcmp:0 *:strcmp:0*:json_cmp:1
歡迎大家 fork and pull request(Github|OSChina|Coding) 。如果覺得這個開源項目很贊,可以點擊項目主頁 右上角的Star,同時把它推薦給更多有需要的朋友。
文檔
具體內容參考\docs\zh\下的文件。務必保證在 閱讀文檔 后再使用。
許可
- Armink (original author)
- Yu Xuebao (current maintainer)
- and the other contributors (CONTRIBUTORS.md)
MIT Copyright ? armink.ztl@gmail.com
總結
以上是生活随笔為你收集整理的struct2json API 文档,s2j库(c语言与json互转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于DINet的虚拟数字人
- 下一篇: wordpress瀑布流图片主题Phot