一种c语言结构体与json相互转换的方法及装置与流程

文档序号:37638312发布日期:2024-04-18 17:57阅读:7来源:国知局
一种c语言结构体与json相互转换的方法及装置与流程

本技术涉及数据交换,具体涉及一种c语言结构体与json相互转换的方法及装置。


背景技术:

1、目前实现c语言结构体与json相互转换方式主要有三种,方式一是手动实现的方式,即由程序员手动编写程序,逐个遍历结构体每个成员,将每个成员转换成json;方式二是调用类似cson这种第三方库,cson通过引入额外的结构体描述信息,可实现结构体直接转成json;方式三是调用xpack这种c++库实现,需要在原有结构体中增加一点额外的标记信息,可实现结构体直接转成json。

2、对于方式一而言,其需要人工进行大量的转换编码工作,工作量很大,自动化程度不高,而且其需要根据不同结构化对象进行定制编码,不具有通用性。此外,一旦数据结构发生变化,需要人工重新进行转换代码修改,维护十分不方便。方式二也需要手动增加结构体成员的描述信息,工作量也较大。方式三是c++实现方式,在类似mcu(micro controlunit,微控制单元)及dsp(digital signal processor,数字信号处理器)这些无操作系统或者资源受限系统中无法运行。

3、因此,目前缺少一种工作量少,且能够运行在mcu、dsp等无操作系统或者资源受限系统上的c语言结构体与json相互转换方法。


技术实现思路

1、本技术提供一种c语言结构体与json相互转换的方法及装置,其相互转换时的工作量小,且能够运行在mcu、dsp等无操作系统或者资源受限系统上。

2、第一方面,本技术实施例提供一种c语言结构体转换成json的方法,所述c语言结构体转换成json的方法包括:

3、基于标准c语言头文件,通过编译生成c语言结构体的结构体描述信息,所述结构体描述信息包括结构体列表信息和结构体成员描述信息,所述结构体列表信息包括结构体名称、成员数量和结构体成员描述信息对象,所述结构体成员描述信息包括成员名称、数据结构类型、类型名称、数组数量、类型大小和偏移地址;

4、调用将c语言结构体转换成json的第一函数,输入参数包括结构体变量对应的内存地址、结构体名称和json根对象,基于所述结构体描述信息,遍历结构体成员描述信息对象中的每个成员,并根据成员的偏移地址计算对应的内存地址;

5、判断成员是否为数组,对于数组数量大于1的成员,基于成员名称创建json数组对象,将json数组对象加入json根对象,并按照数组大小遍历json数组成员:

6、基于所述结构体描述信息,判断数据结构类型是否为结构体类型,根据当前成员是否为数组,以将创建的json对象加入所述json数组对象或json根对象,并确定json对象的值或传入对应的参数。

7、结合第一方面,在一种实施方式中,所述基于所述结构体描述信息,判断数据结构类型是否为结构体类型,根据当前成员是否为数组,以将创建的json对象加入所述json数组对象或json根对象,并确定json对象的值或传入对应的参数,包括:

8、若为非结构体类型,根据数据结构类型创建相应的名称为成员名称的json对象;

9、按照数据结构类型及类型大小从对应的内存地址中取得成员的值,将获取的值设为该json对象的值;

10、若当前成员为数组成员,则将该json对象加入json数组对象,否则将该json对象加入json根对象。

11、结合第一方面,在一种实施方式中,所述基于所述结构体描述信息,判断数据结构类型是否为结构体类型,根据当前成员是否为数组,以将创建的json对象加入所述json数组对象或json根对象,并确定json对象的值或传入对应的参数,包括:

12、若为结构体类型,创建一个相应的名称为成员名称的json对象,若当前成员为数组成员,则将该json对象加入json数组对象,否则将该json对象加入json根对象;

13、递归调用第一函数,并传入当前成员的偏移地址、当前结构体名称和创建的json对象。

14、结合第一方面,在一种实施方式中,所述数据结构类型包括有符号整型、无符号整型、浮点型、字符串和结构体。

15、第二方面,本技术实施例提供了一种c语言结构体转换成json的装置,所述c语言结构体转换成json的装置包括:

16、编译模块,其基于标准c语言头文件,通过编译生成c语言结构体的结构体描述信息,所述结构体描述信息包括结构体列表信息和结构体成员描述信息,所述结构体列表信息包括结构体名称、成员数量和结构体成员描述信息对象,所述结构体成员描述信息包括成员名称、数据结构类型、类型名称、数组数量、类型大小和偏移地址;

17、第一转换模块,其用于调用将c语言结构体转换成json的第一函数,输入参数包括结构体变量对应的内存地址、结构体名称和json根对象,基于所述结构体描述信息,遍历结构体成员描述信息对象中的每个成员,并根据成员的偏移地址计算对应的内存地址;

18、并判断成员是否为数组,对于数组数量大于1的成员,基于成员名称创建json数组对象,将json数组对象加入json根对象,并按照数组大小遍历json数组成员:

19、所述第一转换模块还基于所述结构体描述信息,判断数据结构类型是否为结构体类型,根据当前成员是否为数组,以将创建的json对象加入所述json数组对象或json根对象,并确定json对象的值或传入对应的参数。

20、第三方面,本技术实施例提供了一种json转换成c语言结构体的方法,所述json转换成c语言结构体的方法包括:

21、基于标准c语言头文件,通过编译生成c语言结构体的结构体描述信息,所述结构体描述信息包括结构体列表信息和结构体成员描述信息,所述结构体列表信息包括结构体名称、成员数量和结构体成员描述信息对象,所述结构体成员描述信息包括成员名称、数据结构类型、类型名称、数组数量、类型大小和偏移地址;

22、调用将json转换成c语言结构体的第二函数,输入参数包括结构体变量对应的内存地址、结构体名称和json根对象,基于所述结构体描述信息,遍历结构体成员描述信息对象中的每个成员,并根据成员的偏移地址计算对应的内存地址;

23、根据成员名称寻找对应的json对象,直至遍历所有成员,其中,还判断成员是否为数组,对于数组数量大于1的成员,将json对象解析为json数组对象,再按照数组大小遍历json数组成员;

24、基于所述结构体描述信息,判断数据结构类型是否为结构体类型,以将从json对象中取得对应的值写入对应的内存地址,或传入当前成员的偏移地址、当前结构体名称和当前json对象。

25、结合第三方面,在一种实施方式中,所述基于所述结构体描述信息,判断数据结构类型是否为结构体类型,以将从json对象中取得对应的值写入对应的内存地址,或传入当前成员的偏移地址、当前结构体名称和当前json对象,包括:

26、若为非结构体类型,按照数据结构类型及类型大小从json对象中取得对应的值,并将值写入对应的内存地址。

27、结合第三方面,在一种实施方式中,所述基于所述结构体描述信息,判断数据结构类型是否为结构体类型,以将从json对象中取得对应的值写入对应的内存地址,或传入当前成员的偏移地址、当前结构体名称和当前json对象,包括:

28、若为结构体类型,递归调用第二函数,传入当前成员的偏移地址、当前结构体名称和当前json对象。

29、结合第三方面,在一种实施方式中,所述数据结构类型包括有符号整型、无符号整型、浮点型、字符串和结构体。

30、第四方面,本技术实施例提供了一种json转换成c语言结构体的装置,所述json转换成c语言结构体的装置包括:

31、编译模块,其基于标准c语言头文件,通过编译生成c语言结构体的结构体描述信息,所述结构体描述信息包括结构体列表信息和结构体成员描述信息,所述结构体列表信息包括结构体名称、成员数量和结构体成员描述信息对象,所述结构体成员描述信息包括成员名称、数据结构类型、类型名称、数组数量、类型大小和偏移地址;

32、第二转换模块,其用于调用将json转换成c语言结构体的第二函数,输入参数包括结构体变量对应的内存地址、结构体名称和json根对象,基于所述结构体描述信息,遍历结构体成员描述信息对象中的每个成员,并根据成员的偏移地址计算对应的内存地址;

33、并根据成员名称寻找对应的json对象,直至遍历所有成员,其中,还判断成员是否为数组,对于数组数量大于1的成员,将json对象解析为json数组对象,再按照数组大小遍历json数组成员;

34、所述第二转换模块还基于所述结构体描述信息,判断数据结构类型是否为结构体类型,以将从json对象中取得对应的值写入对应的内存地址,或传入当前成员的偏移地址、当前结构体名称和当前json对象。

35、本技术实施例提供的技术方案带来的有益效果至少包括:

36、本技术中采用编译技术,自动生成结构体描述信息,只需要分别调用一个函数(第一函数或第二函数),不需要再编写额外的代码,即可实现c语言结构体和json的相互转换,显著降低工作量,提高了开发效率;此外,结构体描述信息采用最基本的c语言标准格式,能够运行在mcu、dsp等无操作系统或者资源受限系统上。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1