struct2json自动生成代码教程:Python脚本助力C结构体序列化

struct2json自动生成代码教程:Python脚本助力C结构体序列化

【免费下载链接】struct2jsonA fast convert library between the JSON and C structure. Implement structure serialization and deserialization for C. | C 结构体与 JSON 快速互转库,快速实现 C 结构体的序列化及反序列化项目地址: https://gitcode.com/gh_mirrors/st/struct2json

struct2json是一款高效的C结构体与JSON快速互转库,能够帮助开发者轻松实现C结构体的序列化及反序列化。对于新手来说,手动编写结构体与JSON之间的转换代码不仅繁琐易错,还会大大降低开发效率。本文将详细介绍如何使用struct2json项目中的Python脚本,实现C结构体序列化代码的自动生成,让你告别重复劳动,专注核心业务逻辑开发。

为什么需要自动生成C结构体序列化代码?

在C语言开发中,结构体与JSON的相互转换是一项常见但耗时的任务。传统手动编写转换代码的方式存在诸多问题:

手动编码的痛点

手动编写结构体与JSON的转换代码,需要开发者处理各种数据类型(如基本类型、数组、嵌套结构体等)的序列化和反序列化逻辑,不仅工作量大,还容易出现内存泄漏、格式错误等问题。例如,下面是手动实现结构体转JSON的代码片段:

从图中可以看到,手动编码需要逐一处理结构体的每个成员,代码冗长且重复。

struct2json自动生成的优势

使用struct2json提供的Python脚本,能够自动解析结构体定义,并生成简洁高效的转换代码。对比手动编码,自动生成的代码具有以下优势:

  • 代码简洁:使用库提供的API,大幅减少代码量。
  • 减少错误:避免手动编码可能出现的疏漏。
  • 提高效率:一键生成转换代码,节省开发时间。

下面是使用struct2json自动生成的结构体转JSON代码,简洁明了:

准备工作:获取struct2json项目

首先,需要将struct2json项目克隆到本地。打开终端,执行以下命令:

git clone https://gitcode.com/gh_mirrors/st/struct2json

进入项目目录后,我们主要关注demo文件夹下的相关文件,其中包含了自动生成代码所需的Python脚本和示例结构体定义。

自动生成代码的核心工具:Python脚本解析

struct2json项目提供了两个关键的Python脚本,用于实现代码的自动生成:

generate_struct_defination.py

该脚本用于解析C结构体定义文件(如struct_defination.txt),生成结构体的JSON描述文件(struct_defination.json)。JSON描述文件包含了结构体的名称、成员类型、成员名称等信息,为后续的代码生成提供数据支持。

generate_s2j_code.py

这是自动生成转换代码的核心脚本。它读取struct_defination.json文件,根据结构体的定义,自动生成C语言的序列化(结构体转JSON)和反序列化(JSON转结构体)代码,并分别输出到my_struct_2_json.cmy_struct_2_json.h文件中。

step-by-step:使用Python脚本自动生成代码

下面我们以具体的示例,详细介绍如何使用这两个Python脚本来自动生成C结构体的序列化代码。

步骤1:定义C结构体

首先,需要在demo/struct_defination.txt文件中定义你的C结构体。例如,项目中已有的示例结构体定义如下:

typedef struct McUsrInfoS { int *pInt; int *pIntArray[2]; fun_ptr_CbT fun; fun_ptr_CbT funArray[2]; enum WEEK_DAY day1; enumWEEK_DAY_T day2; enumWEEK_DAY_T day2Array[2]; unsigned char id; unsigned char idArray[2]; char usrType; char usrName[8]; char usrNameArray[2][8]; int32 usrSqno; int32 ussSqnoArray[2]; int64 jobSqno; int64 jobSqnoArray[2]; float rate; float rateArray[2]; double price; double priceArray[2]; } McUsrInfoT, *pMcUsrInfoT; typedef struct McBaseOrdrS { short taskSqno; short taskSqnoArray[2]; double price; double priceArray[2]; } McBaseOrdrT, *pMcBaseOrdrT;

该文件中定义了多个结构体,包括基本数据类型、指针、数组以及枚举等。

步骤2:生成结构体JSON描述文件

运行generate_struct_defination.py脚本,解析struct_defination.txt并生成struct_defination.json

cd demo python3 generate_struct_defination.py

执行成功后,会在demo目录下生成struct_defination.json文件,该文件以JSON格式描述了结构体的详细信息。

步骤3:自动生成C转换代码

运行generate_s2j_code.py脚本,根据struct_defination.json生成C语言的转换代码:

python3 generate_s2j_code.py

执行完成后,会在demo目录下生成以下文件:

  • my_struct_2_json.h:包含生成的函数声明。
  • my_struct_2_json.c:包含生成的序列化和反序列化函数实现。

生成的代码示例

生成的my_struct_2_json.c文件中,包含了类似以下的结构体转JSON函数:

cJSON *struct_to_json_McUsrInfoT(void* struct_obj) { s2j_create_json_obj(json_obj_); McUsrInfoT *struct_obj_ = (McUsrInfoT *)struct_obj; s2j_json_set_basic_element(json_obj_, struct_obj_, int, pInt); s2j_json_set_array_element(json_obj_, struct_obj_, int, pIntArray, 2); s2j_json_set_basic_element(json_obj_, struct_obj_, int, fun); s2j_json_set_array_element(json_obj_, struct_obj_, int, funArray, 2); s2j_json_set_basic_element(json_obj_, struct_obj_, int, day1); s2j_json_set_basic_element(json_obj_, struct_obj_, int, day2); s2j_json_set_array_element(json_obj_, struct_obj_, int, day2Array, 2); s2j_json_set_basic_element(json_obj_, struct_obj_, int, id); s2j_json_set_array_element(json_obj_, struct_obj_, int, idArray, 2); s2j_json_set_basic_element(json_obj_, struct_obj_, int, usrType); s2j_json_set_basic_element(json_obj_, struct_obj_, string, usrName); s2j_json_set_array_element(json_obj_, struct_obj_, string, usrNameArray, 2); s2j_json_set_basic_element(json_obj_, struct_obj_, int, usrSqno); s2j_json_set_array_element(json_obj_, struct_obj_, int, ussSqnoArray, 2); s2j_json_set_basic_element(json_obj_, struct_obj_, int, jobSqno); s2j_json_set_array_element(json_obj_, struct_obj_, int, jobSqnoArray, 2); s2j_json_set_basic_element(json_obj_, struct_obj_, double, rate); s2j_json_set_array_element(json_obj_, struct_obj_, double, rateArray, 2); s2j_json_set_basic_element(json_obj_, struct_obj_, double, price); s2j_json_set_array_element(json_obj_, struct_obj_, double, priceArray, 2); return json_obj_; }

以及JSON转结构体函数:

如何在项目中使用生成的代码

生成转换代码后,就可以在你的C项目中使用这些函数来实现结构体与JSON的快速互转了。

包含头文件

在需要使用转换功能的C文件中,包含生成的头文件:

#include "my_struct_2_json.h"

结构体转JSON

调用生成的struct_to_json_<结构体名>函数,将结构体实例转换为JSON对象:

McUsrInfoT usrInfo; // 初始化usrInfo... cJSON *json = struct_to_json_McUsrInfoT(&usrInfo); // 使用json对象... cJSON_Delete(json); // 记得释放内存

JSON转结构体

调用生成的json_to_struct_<结构体名>函数,将JSON对象转换为结构体实例:

cJSON *json = cJSON_Parse(jsonStr); // 解析JSON字符串 McUsrInfoT *usrInfo = (McUsrInfoT *)json_to_struct_McUsrInfoT(json); // 使用usrInfo... free(usrInfo); // 记得释放内存 cJSON_Delete(json);

总结:自动生成代码带来的效率提升

通过struct2json项目提供的Python脚本,我们可以轻松实现C结构体序列化代码的自动生成,相比传统的手动编码方式,具有以下显著优势:

  • 大幅减少代码量:将数十行甚至上百行的手动代码浓缩为几行库函数调用。
  • 降低出错风险:避免手动编码可能出现的内存管理错误和格式错误。
  • 提高开发效率:开发者可以专注于业务逻辑,而非重复的转换代码编写。
  • 易于维护:当结构体定义发生变化时,只需重新运行脚本即可更新转换代码。

如果你正在进行C语言开发,并且需要处理结构体与JSON的转换,不妨尝试一下struct2json的自动生成功能,相信它会为你带来意想不到的效率提升!

官方文档与资源

  • 项目源码:struct2json/
  • 示例代码:demo/
  • 头文件定义:struct2json/inc/s2j.h

【免费下载链接】struct2jsonA fast convert library between the JSON and C structure. Implement structure serialization and deserialization for C. | C 结构体与 JSON 快速互转库,快速实现 C 结构体的序列化及反序列化项目地址: https://gitcode.com/gh_mirrors/st/struct2json

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考