C语言JSON序列化/反序列化
最近想找一个C语言处理嵌套结构体和结构体数组的json库,理想的是能够很容易处理复杂结构体嵌套,并且使用简单的,但是没找到比较合适的,于是打算自己封装一个;
两个问题:
- C语言结构体本身没有元数据,这也就没法在生成过程中自动分析类型进行处理,所以,需要生成对应结构体的元数据信息,根据元数据完成对结构体的序列化和反序列化;
 - 结构体的嵌套很复杂,需要支持多层结构体和结构体数组直接互相嵌套的序列化反序列化,于是考虑使用递归函数,结合1中的元数据,进行结构体偏移和处理;
 
考虑如下步骤:
- 配置xml文件,文件中配置结构体,结构体中的成员属性,以及它们之间的关系;
 - 结合Tinyxml库编写解析xml文件的工具,通过这个工具生成包含结构体,结构体元数据(包含结构体关系,成员名称,类型,偏移,大小等),序列化/反序列化接口的头文件;
 - 抽离公共的json操作函数到公共头文件,这些操作函数通过元数据和偏移的方式处理结构体和json,更深入部分则使用了cJSON库;
 - 模块引用2中生成的头文件,然后通过结构体指针,即可完成结构体序列化成json,以及json反序列化成结构体;
 
花了两天时间来做这些事情,初步测试了下,功能正常,也达到了我预期的一行代码序列化,一行代码反序列化的高级语言的json操作特性;
总之,满意;
C语言JSON序列化/反序列化的更多相关文章
- json序列化 & 反序列化
		
json序列化: json的dumps方法可以将json格式数据序列为python的相关数据类型,比如str,常用于打印,另外,在序列化时,中文汉字被转换为unicode编码,在dumps函数中添加参 ...
 - json序列化反序列化Jackson相关注解
		
1.@Transient @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性:如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架 ...
 - nodejs - json序列化&反序列化示例
		
// demo-json.js var obj = { "name": "LiLi", "age": 22, "sex" ...
 - spring cloud jackson 枚举json互转 枚举json序列化/反序列化
		
先定义一个枚举基类 import com.fasterxml.jackson.databind.annotation.JsonDeserialize; @JsonDeserialize(using = ...
 - JSON序列化反序列化
		
JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的文本格式,可以很容易在 ...
 - Newtonsoft.Json  序列化反序列化
		
public class People { public string name { get; set; } public string age { get; set; } public string ...
 - 怎样在ASP.NET(C#) 使用Json序列化反序列化问题?
		
using System; using System.Collections.Generic; using System.Web; using System.Web.Script.Serializat ...
 - ASP.NET(C#) Json序列化反序列化帮助类Jsonhelper
		
原文地址:https://ken.io/note/csharp-asp.net-jsonhelper using System; using System.Collections.Generic; u ...
 - 关于spring中请求返回值的json序列化/反序列化问题
		
https://cloud.tencent.com/developer/article/1381083 https://www.jianshu.com/p/db07543ffe0a 先留个坑
 
随机推荐
- 如何通过Restful API的方式读取SAP Commerce Cloud的Product图片
			
需求:我在SAP Commerce Cloud的backoffice里给某product维护了一些图片: 分别位于Normal,Thumbnails和Others等字段: 现在我想通过Restful ...
 - Elasticsearch 是什么
			
Elasticsearch 是什么 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功 ...
 - MySQL Network--域名与VIP
			
VIP与域名1.域名能在多个IDC切换,而VIP通常在特定网段内切换.2.VIP切换可以立即生效,而域名切换存在一定时间延迟. DNS解析顺序:1.查询本地域名映射配置(/etc/hosts)2.查查 ...
 - 13.5. zipfile — Work with ZIP archives
			
13.5. zipfile — Work with ZIP archives Source code: Lib/zipfile.py The ZIP file format is a common a ...
 - prometheus 告警规则
			
GitHub网址1 https://github.com/samber/awesome-prometheus-alerts 网址2 https://awesome-prometheus-alerts. ...
 - 使用Cloudera Manager搭建MapReduce集群及MapReduce HA
			
使用Cloudera Manager搭建MapReduce集群及MapReduce HA 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.通过CM部署MapReduce On ...
 - h5中history实例
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - python链式对比
			
参考 https://www.cnblogs.com/shanghongyun/p/10519579.html 为什么Python中“2==2>1”结果为True在Python中,你可能会发现这 ...
 - CSS 相邻元素选择器
			
相邻兄弟选择器(Adjacent sibling selector)可选择紧接在另一元素后的元素,且二者有相同父元素.选择相邻兄弟 如果需要选择紧接在另一个元素后的元素,而且二者有相同的父元素,可以使 ...
 - 织梦DedeCMS会员空间内的文章列表无法分页的解决方法
			
DedeCMS 5.7会员空间的文章列表分页显示不正常,总是显示0页0条记录错误.下面告诉大家如何解决这个问题: 找到并打开include/arc.memberlistview.class.php文件 ...