如何用C语言进行json的序列化和反序列化

json是目前最为流行的文本数据传输格式,特别是在网络通信上广泛应用,随着物联网的兴起,在嵌入式设备上,也需要开始使用json进行数据传输,那么,如何快速简洁地用c语言进行json的序列化和反序列化呢?
当前,应用最广泛的c语言json解析库当属cjson,但是,使用cjson读json进行序列化和反序列化,需要根据key一个一个进行处理,会导致代码冗余,逻辑性不强,哪有没有更好的方法呢?
思路在android平台,一般会使用gson等工具解析json,这些工具将json直接映射成对象,在c语言上使用对象的概念,我们需要借助结构体,然而,最大的问题在于,c语言没有高级语言具有的反射机制,直接从json映射到结构体对象几乎是不可能的。
怎么解决呢,既然c语言没有反射机制,那么我们可以自己定义一套类似于反射的机制,这里我将其称之为结构体数据模型,在数据模型中,我们需要准确地描述结构体的特征,包括结构体各成员的名称,类型,在结构体中的偏移。
有了这些,我们可以在解析josn的时候,将解析得到的数据直接写入到对应的内存里面去,或者是在序列化的时候,直接从对应的内存中读取数据,进行处理。
实现cson正是采用上面说到的思路,使用数据模型对结构体进行描述,然后基于cjson,根据数据模型进行解析,将解析得到的数据直接写入到对应的内存区域,从而实现从json到结构体对象的映射。
cson最基本的数据模型定义如下:
typedef struct cson_model{ csontype type; /**< 数据类型 */ char *key; /**< 元素键值 */ short offset; /**< 元素偏移 */} csonmodel;通过type描述结构体成员的数据类型,key描述该成员在json中对应的字段,offset描述该结构体成员在结构体中的偏移,cson在解析json的时候,根据type调用相应的cjson api并传递key作为参数,得到解析出的数据,然后根据offset将数据写入到对应的内存空间。
比如说这样一个结构体:
struct project{ int id; char *name;}该结构体包含两个成员,对于成员id,我们使用数据模型对其进行描述
{.type=cson_type_char, key=id, offset=0}对于结构体的每个成员,都进行数据模型的定义,就可以得到一个完整的结构体数据模型,cson会根据这个模型,进行解析。
因为是通过直接写内存的方式,所以在写不同类型的量到内存中时,会多次用到强制转型,导致cson中赋值的代码都类似于:
*(int *)((int)obj + model[i].offset) = (int)csondecodenumber(json, model[i].key);当然,上面说到的数据模型,只适用于基本数据类型的数据,对于子结构体,链表,数组等,需要对数据模型的定义进行扩充,有兴趣的朋友可以直接阅读cson源码。

贸泽开售Analog Devices ADA4355紧凑型高性能光电探测器接收器μModule
林芩论币:总结了一些投资朋友遇到的一些小问题,有兴趣的可以看一下
在新基建的征途中,维谛技术的成长与发展
中国移动与腾讯和今日头条合作,究竟又想做什么大动作
简单认识IA-64架构处理器
如何用C语言进行json的序列化和反序列化
小米6情怀不再!售价2999起,理由竟是新增了这几项黑科技
HeyTap启能行动2.0作为OPPO面向IoT行业的能力开放行动?
Uri Shalit 发文称:标准化逻辑回归和深度学习一样好
开源EDA何去何从?
古瑞瓦特光伏逆变器混搭方案实现石港科技园发电收益最大化
苹果太空船总部因计划太过激进 完建时间要推迟
小米6什么时候上市?小米6最新消息:此次小米6备货充足,不再玩饥饿营销?
如何提高伺服液压机的作业效率
嵌入式工程师点个灯、牛刀小试,芯片运行程序就得这么玩!
无线遥控开关——构建智能现实生活新框架
当蓝牙Mesh网络遇到Arm Cordio IP,物联网应用终于要爆发!
中国医疗器械市场规模,如何突破困境
2017电子厂商TOP 50榜单 富士康居全球EMS第一
CES 2013最新潮的家庭安全系统:iPhone变看门狗?!