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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/3/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_objJSON對象

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互转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。