c语言json映射,GitHub - xujun621/cson: 基于C语言的json数据映射解析库

CSON

68747470733a2f2f696d672e736869656c64732e696f2f62616467652f76657273696f6e2d312e302e312d627269676874677265656e2e737667

68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c642d323031392e392e342d627269676874677265656e2e737667

基于cJSON,运行于C语言平台的json-struct模型解析工具

简介

CSON是一个简单的cJSON的二次封装,相比于使用原生cJSON一层一层解析的方式,CSON采用模型映射的方式,使用模型将结构体的特征进行描述,然后根据模型,将json数据直接解析成结构体,免去使用原生cJSON需要多次调用API的复杂性,可以很大程度减少代码冗余,增加代码逻辑性。

CSON的模型映射借鉴了高级语言(比如说Java)的反射机制,通过建立数据模型,记录结构体的元素,类型,偏移,然后直接在内存层面进行操作,对C语言提供类似于gson这样的高效json解析工具

使用

CSON通过数据模型将结构体和json建立映射关系,因此,你需要做的就是在声明结构体的时候同时,使用数据模型对结构体进行描述,之后,只需要直接调用CSON的api即可

声明结构体

/** 项目结构体 */

struct project

{

int id;

char *name;

};

/** 仓库结构体 */

struct hub

{

int id;

char *user;

struct project *cson;

};

定义数据模型

对每一个需要使用cson的结构体,都需要定义相对应的数据模型

/** 项目结构体数据模型 */

CsonModel projectModel[] =

{

CSON_MODEL_OBJ(struct project),

CSON_MODEL_INT(struct project, id),

CSON_MODEL_STRING(struct project, name),

};

/** 仓库结构体数据模型 */

CsonModel hubModel[] =

{

CSON_MODEL_OBJ(struct hub),

CSON_MODEL_INT(struct hub, id),

CSON_MODEL_STRING(struct hub, user),

CSON_MODEL_STRUCT(struct hub, cson, projectModel, sizeof(projectModel)/sizeof(CsonModel))

};

使用CSON解析

只需要定义好数据模型,就可以使用CSON读json进行序列化和反序列化

void csonDemo(void)

{

char *jsonDemo = "{\"id\": 1, \"user\": \"Letter\", \"cson\": {\"id\": 2, \"name\": \"cson\"}}";

/** 解析json */

struct hub *pHub = csonDecode(jsonDemo, hubModel, sizeof(hubModel)/sizeof(CsonModel));

printf("hub: id: %d, user: %s, project id: %d, project name: %s\r\n",

pHub->id, pHub->user, pHub->cson->id, pHub->cson->name);

/** 序列化对象 */

char *formatJson = csonEncodeFormatted(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));

printf("format json: %s\r\n", formatJson);

/** 释放结构体对象 */

csonFree(pHub, hubModel, sizeof(hubModel)/sizeof(CsonModel));

/** 释放序列化生成的json字符串 */

csonFreeJson(formatJson);

}

运行结果:

hub: id: 1, user: Letter, project id: 2, project name: cson

format json: {

"id": 1,

"user": "Letter",

"cson": {

"id": 2,

"name": "cson"

}

}

可以看到,无论是解析json,还是序列化结构体到json,在使用CSON的情况下,都只需要一行代码就可以解决,同样的操作,在使用原生cJSON的情况下,你可能需要多次判断,解析元素

结构体数据类型

CSON采用数据模型对结构体进行解析,在方便json操作的同时,也给结构体的定义带来了一些限制,目前,CSON所支持在结构体中定义的数据类型包括:

整数(char, short, int, long)

浮点数(float, double)

字符串(char *)

基本类型数组(char[], short[], int[], long[], float[], double[], *char[])

子结构体(指针形式)

链表(CsonList)

其中,为了方便解析,CSON定义了一个专用的链表(CsonList),用于对json中复杂结构的数组映射

CSON支持的数据类型基本包括绝大多数使用场景,对于一些之前就定义好的结构体,可能需要稍微做一点修改

数据模型映射

CSON采用数据模型建立结构体同json之间的映射,数据模型通过结构体数组进行定义,数据模型定义如下:

/**

* @brief CSON数据模型定义

*

*/

typedef struct cson_model

{

CsonType type; /**< 数据类型 */

char *key; /**< 元素键值 */

short offset; /**< 元素偏移 */

union

{

struct

{

struct cson_model *model; /**< 子结构体模型 */

short size; /**< 子结构体模型大小 */

} sub; /**< 子结构体 */

struct

{

CsonType eleType; /**< 数组元素类型 */

short size; /**< 数组大小 */

} array; /**< 数组 */

int objSize; /**< 对象大小 */

CsonType basicListType; /**< 基础数据链表类型 */

} param;

} CsonModel;

对于每一个需要使用CSON的结构体,都需要定义一个数据模型,每一个数据模型都需要包含一条结构体描述CSON_MODEL_OBJ(type)以及若干个数据描述,取决于结构体的成员数量

一般情况下,你只需要使用CSON提供的宏进行数据模型条目的定义,数据模型宏与对应的数据类型对应如下:

数据模型宏

数据类型

备注

CSON_MODEL_OBJ(type)

结构体

用于描述整个结构体,每一个数据模型都需要包含此条目

CSON_MODEL_CHAR(type, key)

char

CSON_MODEL_SHORT(type, key)

short

CSON_MODEL_INT(type, key)

int

CSON_MODEL_LONG(type, key)

long

CSON_MODEL_FLOAT(type, key)

float

CSON_MODEL_DOUBLE(type, key)

double

CSON_MODEL_BOOL(type, key)

bool

C没有bool,对应为char

CSON_MODEL_STRING(type, key)

char *

CSON_MODEL_STRUCT(type, key, submodel, subsize)

子结构体

子结构体必须是结构体指针的形式

CSON_MODEL_LIST(type, key, submodel, subsize)

CsonList

CSON定义的链表

CSON_MODEL_ARRAY(type, key, elementType, arraySize

数组

支持基本数据类型, 数组的每一个元素必须合法

API

CSON源文件有完整的注释,可以通过Doxygen等工具导出完整的API文档,以下是几个关键API的说明

初始化

初始化CSON,提供内存分配和内存释放函数,对于标准C库可以使用malloc和free

void csonInit(void *malloc, void *free)

参数

malloc 内存分配函数

free 内存释放函数

反序列化

解析json,将json字符串反序列化成结构体对象

void *csonDecode(const char *jsonStr, CsonModel *model, int modelSize)

参数

jsonStr json字符串

model 描述目标结构体的数据模型

modelSize 数据模型大小

返回

void * 反序列化得到的结构体对象

序列化

编码结构体,将结构体对象序列化成json字符串

char* csonEncode(void *obj, CsonModel *model, int modelSize, int bufferSize, int fmt)

参数

obj 源结构体对象

model 描述源结构体的数据模型

modelSize 数据模型大小

bufferSize 可分配给json字符串的空间大小,需要根据内容估计大小

fmt 是否格式化json字符串

返回

char * 序列化得到的json字符串

空间释放

CSON提供了两个释放内存的函数,用于释放CSON生成的结构体对象和json字符串

释放结构体对象

void csonFree(void *obj, CsonModel *model, int modelSize)

参数

obj 待释放的结构体对象

model 待释放的结构体数据模型

modelSize 待释放的结构体数据模型大小

释放json字符串

void csonFreeJson(const char *jsonStr)

参数

jsonStr 待释放的json字符串

注意

数据模型根据结构体不同而不同,数据模型的数量=结构体成员数量+1,多出来的一条是定义结构体CSON_MODEL_OBJ(type)

数组类型映射时会处理给进去的数组大小,所以请确保每一个数组元素都是合法的

基本数据类型链表采用类似子结构体的方式,CSON默认定义了基本数据类型链表元素的数据模型,通过类似CSON_MODEL_LIST(struct test, strList, CSON_MODEL_STRING_LIST, CSON_BASIC_LIST_MODEL_SIZE)进行定义即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cad渐变线怎么画_怎么画压力线和支撑线

支撑线与压力线的基本画法画法&#xff1a;将两个或两个以上的相对低点连成一条直线即得到支撑线将两个或两个以上的相对高点连成一条直线即得到压力线用法&#xff1a;1.支撑线和压力线的作用支撑线又称为抵抗线。当股价跌到某个价位附近时&#xff0c;股价停止下跌&#xff0…

c语言为什么要建项目,一个C语言小项目为什么都说牛逼

原标题&#xff1a;一个C语言小项目为什么都说牛逼意在鼓励C语言学者。更有兴趣&#xff0c;学习更富有创业和乐趣&#xff01;推荐加学习交流群&#xff1a;658807522 可以在一起学习交流&#xff0c;既是参赛选手&#xff0c;又是学者&#xff0c;也可以先学习再参赛&#xf…

单片机c语言 oxfe,AVR单片机入门及C语言高效设计实践(五)

ATMEAGl6L的中断系统什么是“中断”?顾名思义中断就是中断某一工作过程去处理一些与本工作过程无关或间接相关或临时发生的事件&#xff0c;处理完后&#xff0c;则继续原工作过程。比如&#xff1a;你在看书&#xff0c;电话响了&#xff0c;你在书上做个记号后去接电话&…

android 生成 资源文件,SVG-Android开源库——SVG生成Vector资源文件的编辑预览工具...

Vector矢量图在Android项目中的利用愈来愈广泛&#xff0c;但是如果你想用Android Studio自带的工具将SVG图片转化成Vector资源文件却是相当麻烦&#xff0c;首先能支持的SVG规范较少&#xff0c;其次操作流程麻烦。而另外一种方式就是通过http://inloop.github.io/svg2android…

android微信朋友圈相册背景,Android 仿微信朋友圈图片拖拽返回

目前的app的动画效果是越来越炫了&#xff0c;很多主流app的图片预览返回都有类似功能&#xff0c;比较常见的是ios自带相册&#xff0c;微信朋友圈等等。自己项目中也有类似功能&#xff0c;最近整理了一下这个功能的代码&#xff0c;做个笔记记录&#xff0c;有兴趣的朋友可以…

erp采购总监个人总结_《用友 ERP 培训教程:财务核算/供应链管理/物料需求计划》ERP概述 : ERP基础知识...

第1章 ERP概述本章重点_- _ERP概要_- _ERP实施成功的必要条件_- _ERP几个重要的名词解释用友ERP-U8&#xff08;V8 .72&#xff09;简介及功能按钮说明1.1 ERP基础知识1.1.1 ERP基本概念ERP&#xff08;Enterprise Resources Planning&#xff09;中文叫做企业资源规划&…

soc 设计soc设计 uml实务手册_企业内训“软件需求设计建模方法学全程实例剖析”训练方案(2020年)...

※训练介绍※利润需求-设计。软件开发中&#xff0c;需求是解决“系统怎样好卖”的问题&#xff0c;设计是解决“降低开发成本”的问题。要迈向“低成本制造好卖的产品”的境界&#xff0c;并非喊喊口号就能达到。口号&#xff1a;我们只做最重要的需求&#xff0c;尽快把系统推…

鸿蒙分布式通讯子系统,【鸿蒙】分布式通信子系统--让华为手机发现Hi3861开发板...

目录&#xff1a;工具步骤运行结果工具&#xff1a;1. 华为手机&#xff0c;需要有多设备协同功能。在设置->更多连接->多设备协同&#xff0c;查看是否有多设备协同功能&#xff0c;此功能使用的就是coap协议。2. Hi3861开发板步骤&#xff1a;1. 修改源码&#xff0c;…

winform 统计大量数据重复的元素个数_DAY10——推断统计之概率与概率分布:常见的离散型概率分布...

「数学期望——某件事情大量发生之后的平均结果」----------------分割又分割----------------------昨天文章排版出了问题&#xff0c;今天重新排版。数据的三个统计维度&#xff1a;集中程度、离散程度、分布情况。集中程度&#xff1a;期望离散程度&#xff1a;方差、标准差…

xss跨站脚本攻击_常见攻击之xss跨站脚本攻击

前言随着互联网的不断发展&#xff0c;web应用的互动性也越来越强。相应的&#xff0c;在用户体验提升的同时安全风险也会跟着有所增加。今天&#xff0c;我们就来讲一讲web渗透中常见的攻击方式之一&#xff0c;XSS攻击。首先需要了解他是如何工作的&#xff0c;以及我们如何利…

缺陷调研报告_质量零缺陷 | 打造极致产品的质量管理之道

质量是政治质量是生命质量是效益为强化全员“零缺陷”质量意识&#xff0c;坚决打赢质量提升攻坚战&#xff0c;现开设“质量零缺陷”专栏&#xff0c;着力宣传全院各单位在加强质量管理&#xff0c;落实零缺陷理念等方面的典型做法和质量故事。今天为大家带来的是曾获得“全国…

oracle 从右往左截取_截取GIF、调分辨率、快捷拨号,三星这些功能让人爱不释手...

昨天三星5G手机正式上市后&#xff0c;今天又爆出苹果被三星拒绝后要转向华为购买5G芯片&#xff0c;苹果如此操作是真的走投无路了&#xff1f;再看看吃瓜群众们&#xff0c;吐槽一波接一波。​一会儿&#xff0c;嫌弃三星信号频段不完全&#xff0c;10nm的工艺制程太差。一会…

html中表单的校验的插件,功能强大的jquery.validate表单验证插件

本文实例为大家分享了jquery.validate表单验证的使用方法&#xff0c;供大家参考&#xff0c;具体内容如下1 、表单验证的准备工作在开启长篇大论之前&#xff0c;首先将表单验证的效果展示给大家。1.点击表单项&#xff0c;显示帮助提示2.鼠标离开表单项时&#xff0c;开始校验…

swing 显示文件下文件_Linux 文件权限详解

阅读五分钟&#xff0c;每日十点&#xff0c;和您一起终身学习&#xff0c;这里是程序员Android本篇文章主要介绍 Android 开发中的部分知识点&#xff0c;通过阅读本篇文章&#xff0c;您将收获以下内容:一、使用ls -l 显示文件的详细信息二、Linux下的文件权限分组三、drwx 代…

未来教育计算机二级书怎么样,未来教育计算机二级

1册图书1张光盘&#xff0c;轻松应对2018年一级计算机基础及MS Office应用考试 n 1.历年真题精选&#xff0c;全方位把握真考动向&#xff0c;具有练习价值 n (1)新大纲、新题型、新题库&#xff0c;全方位解读无纸化考试&#xff0c;帮助考生轻松过关。 n (2)精选2017年~2016年…

江苏计算机专业,行情火爆的计算机专业:江苏计算机专业高校最低录取分排序...

原标题&#xff1a;行情火爆的计算机专业&#xff1a;江苏计算机专业高校最低录取分排序现如今的十大热门专业里&#xff0c;计算机类专业总是稳居榜首&#xff01;几年前市场对计算机专业人才的需求非常大&#xff0c;计算机专业红得发紫&#xff0c;毕业生是"皇帝的女儿…

em算法 实例 正态分布_Petuum提出序列生成学习算法通用框架

近日&#xff0c;来自人工智能创业公司 Petuum 的研究人员发表论文&#xff0c;提出序列生成学习算法的通用框架——广义的熵正则化策略优化框架(Generalized Entropy-Regularized Policy Optimization)。该框架是对包括最大似然学习 (MLE)、增强学习 (RL) 等多种广泛使用的算法…

springboot 集成redis_一文详解Spring Boot 集成 Redis

redis设置&#xff1a;修改redis服务器的配置文件vim /usr/local/redis/bin/redis.confbind 0.0.0.0 protected-mode no重新启动redissystemctl restart redis.service #重新启动服务注意&#xff1a;服务器的话需要设置安全组开放端口1.导入依赖org.springframework.boot …

计算机用手机的网络,电脑做热点让手机上网_电脑开热点给手机用

2016-11-26 12:00:20你好!很高兴为你解答&#xff0c;有两个解决办法:1.在每台机的本地连接--属性--常规--internet协议(TCP/IP)--常规里,设置成"自动获取IP地址"2.在每台机的本地连接--...2017-01-06 14:44:121.打开任务栏右下角的网络连接&#xff0c;在弹出的界面…

shell开启飞行模式_原来手机飞行模式有这么多用处!99%的深圳人都不知道...

相信大家都知道我们的手机里有个功能叫「飞行模式」(又称航空模式)它可以关掉手机收发信号的装置避免手机信号对飞机飞行造成干扰来源&#xff1a;网络那么对于不常坐飞机的人来说「飞行模式」功能是不是毫无用处呢&#xff1f;当然不是今天易小姐就带大家解锁关于「飞行模式」…