搜索
bottom↓
回复: 127

【开源】C结构体与 JSON 快速互转库--struct2json 发布

  [复制链接]

出0入198汤圆

发表于 2015-11-9 22:18:01 | 显示全部楼层 |阅读模式
本帖最后由 sunnydragon 于 2015-11-10 08:17 编辑

struct2json 是一个开源的C结构体与 JSON 快速互转库,它可以快速实现 结构体对象JSON 对象 之间序列化及反序列化要求。快速、简洁的 API 设计,大大降低直接使用 JSON 解析库来实现此类功能的代码复杂度。
1、起源
把面向对象设计应用到C语言中,是当下很流行的设计思想。由于C语言中没有类,所以一般使用结构体struct 充当类,那么结构体变量就是对象。有了对象之后,很多时候需要考虑对象的序列化及反序列化问题。C语言不像很多高级语言拥有反射等机制,使得对象序列化及反序列化被原生的支持。
对于C语言来说,序列化为 JSON 字符串是个不错的选择,所以就得使用 cJSON 这类 JSON 解析库,但是使用后的代码冗余且逻辑性差,所以萌生对cJSON库进行二次封装,实现一个 struct 与 JSON 之间快速互转的库。 struct2json 就诞生于此。下面是 struct2json 主要使用场景:
  • 持久化 :结构体对象序列化为 JSON 对象后,可直接保存至文件、Flash,实现对结构体对象的掉电存储;
  • 通信 :高级语言对JSON支持的很友好,例如: Javascript、Groovy 就对 JSON 具有原生的支持,所以 JSON 也可作为C语言与其他语言软件之间的通信协议格式及对象传递格式;
  • 可视化 :序列化为 JSON 后的对象,可以更加直观的展示到控制台或者 UI 上,可用于产品调试、产品二次开发等场景;


2、如何使用
2.1 声明结构体
如下声明了两个结构体,结构体 Hometown 是结构体 Student 的子结构体
  1. /* 籍贯 */
  2. typedef struct {
  3.     char name[16];
  4. } Hometown;

  5. /* 学生 */
  6. typedef struct {
  7.     uint8_t id;
  8.     uint8_t score[8];
  9.     char name[10];
  10.     double weight;
  11.     Hometown hometown;
  12. } Student;
复制代码
2.2 将结构体对象序列化为 JSON 对象
使用前源文件
使用后源文件
2.3 将 JSON 对象反序列化为结构体对象
使用前源文件
使用后源文件
欢迎大家 fork and pull request(Github|OSChina|Coding) 。如果觉得这个开源项目很赞,可以点击项目主页 右上角的Star,同时把它推荐给更多有需要的朋友。
3、文档
具体内容参考\docs\zh\下的文件。务必保证在 阅读文档 后再使用。

4、许可
MIT Copyright (c) armink.ztl@gmail.com

5、下载

Github:https://github.com/armink/struct2json
本坛:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

有一句段子是这样说的,身家过亿的只关心自己的身体,身家千万的,在担心传承,勉强糊口度日才天天看国际新闻,关心国家大事。

出0入0汤圆

发表于 2015-11-9 22:31:12 | 显示全部楼层
本帖最后由 卢台长 于 2015-11-9 22:44 编辑

前排占位!想学下json啊,有没有相关入门的资料啊,感激不尽!

出0入0汤圆

发表于 2015-11-9 22:54:25 | 显示全部楼层
这个好东西啊!!顶

出0入0汤圆

发表于 2015-11-9 23:06:28 | 显示全部楼层
这个必须顶啊!非常感谢!

出0入0汤圆

发表于 2015-11-9 23:11:26 | 显示全部楼层
看不懂啊

出0入0汤圆

发表于 2015-11-9 23:18:45 | 显示全部楼层
看着好高大上 其实是完全不懂json ( ̄▽ ̄")

出0入0汤圆

发表于 2015-11-9 23:33:44 | 显示全部楼层
楼主是开源的大牛啊!每一次作品都比较惊艳!支持!

出0入0汤圆

发表于 2015-11-9 23:43:59 来自手机 | 显示全部楼层
顶楼主,虽然不懂

出0入0汤圆

发表于 2015-11-9 23:47:29 | 显示全部楼层
赞,可是加载好慢看不到图片.....

出0入134汤圆

发表于 2015-11-9 23:54:05 | 显示全部楼层
楼主的开源项目必须顶起啊

出0入0汤圆

发表于 2015-11-10 00:57:27 来自手机 | 显示全部楼层
先顶为敬~

出0入0汤圆

发表于 2015-11-10 01:20:19 | 显示全部楼层
必须顶啊

楼主的开源都是精品啊。好几个都是我在项目用的。再次感谢楼主

出200入0汤圆

发表于 2015-11-10 02:40:14 来自手机 | 显示全部楼层
好东东,正需要,感谢分享!

出0入0汤圆

发表于 2015-11-10 07:17:56 | 显示全部楼层
楼主厉害,正在看json

出0入198汤圆

 楼主| 发表于 2015-11-10 08:03:28 | 显示全部楼层
卢台长 发表于 2015-11-9 22:31
前排占位!想学下json啊,有没有相关入门的资料啊,感激不尽!

JSON是很常用的数据格式,入门资料网上有很多,你可以看下这个:http://www.runoob.com/json/json-syntax.html

知乎里面也有很多关于JSON与XML等其他格式对比:http://www.zhihu.com/question/25636060

出0入198汤圆

 楼主| 发表于 2015-11-10 08:07:47 | 显示全部楼层
散吧散吧 发表于 2015-11-9 23:33
楼主是开源的大牛啊!每一次作品都比较惊艳!支持!

多谢支持,透露下,这个struct2json 会与 即将发布的EasyFlash(https://github.com/armink/EasyFlash)一个全新功能有关。

出0入198汤圆

 楼主| 发表于 2015-11-10 08:08:40 | 显示全部楼层
Ray______ 发表于 2015-11-9 23:47
赞,可是加载好慢看不到图片.....

已经更新图片链接为国内源了,你再试试~

出0入198汤圆

 楼主| 发表于 2015-11-10 08:13:18 | 显示全部楼层
FireHe 发表于 2015-11-10 01:20
必须顶啊

楼主的开源都是精品啊。好几个都是我在项目用的。再次感谢楼主 ...

多谢支持哈~提前透露下,EasyFlash即将发布的一个全新功能也将会用到这个struct2json,请继续关注。

出0入4汤圆

发表于 2015-11-10 08:37:29 | 显示全部楼层
楼主开源的都是好东西啊。

出0入0汤圆

发表于 2015-11-10 08:40:50 | 显示全部楼层
高达上呀。

出0入0汤圆

发表于 2015-11-10 08:43:46 | 显示全部楼层
谢楼主,它和Jansson相比如何,不妨列出Footprint?

出0入198汤圆

 楼主| 发表于 2015-11-10 09:06:10 | 显示全部楼层
styleno1 发表于 2015-11-10 08:43
谢楼主,它和Jansson相比如何,不妨列出Footprint?

struct2json 功能是做C结构体与 JSON 快速互转,降低代码量,提高代码逻辑性。代码是基于cJSON库的二次封装。

Jansson应该与cJSON库两者同为C的JSON解析库,这两者对比才更有意义。

出0入0汤圆

发表于 2015-11-10 09:17:55 | 显示全部楼层
搬板凳,坐下学习

出0入0汤圆

发表于 2015-11-10 09:33:14 | 显示全部楼层
不错,这个有用

出0入0汤圆

发表于 2015-11-10 09:39:56 | 显示全部楼层
单片机可以跑吗?内存耗量怎么样?

出0入0汤圆

发表于 2015-11-10 10:00:11 | 显示全部楼层
Jansson是不是最近物联网活了,开始用的多起来了?以前都没怎么看到过,最近的物联网的通讯协议都用Jansson

出0入0汤圆

发表于 2015-11-10 10:07:15 | 显示全部楼层
本帖最后由 RAMILE 于 2015-11-10 10:08 编辑

easyflash 补上这个功能就完美了

我觉得CSV格式列表数据密度更高点

出0入17汤圆

发表于 2015-11-10 10:12:41 | 显示全部楼层
感谢lz,用的到。

出0入0汤圆

发表于 2015-11-10 10:26:01 | 显示全部楼层
sunnydragon 发表于 2015-11-10 08:07
多谢支持,透露下,这个struct2json 会与 即将发布的EasyFlash(https://github.com/armink/EasyFlash)一 ...

你的EasyFlash越来越牛叉了,轻量级的sqlite

出0入0汤圆

发表于 2015-11-10 10:53:00 | 显示全部楼层
标记下,这个方便。

出0入0汤圆

发表于 2015-11-10 10:58:45 | 显示全部楼层
谢谢分享!!!

出5入8汤圆

发表于 2015-11-10 11:42:07 | 显示全部楼层
楼主 又出大杀器啦     

谢谢分享

出0入0汤圆

发表于 2015-11-10 13:30:36 | 显示全部楼层
JSON  除了web通信,别的用的少吧

XML 很多文件存储都是这个格式

出0入0汤圆

发表于 2015-11-10 13:31:33 | 显示全部楼层
原来是 “嵌入式Flash闪存库 EasyFlash ”作者,   大牛  膜拜下!

出0入0汤圆

发表于 2015-11-10 13:44:47 | 显示全部楼层
好东西,楼主尽出精品

出0入8汤圆

发表于 2015-11-10 14:09:17 | 显示全部楼层
本帖最后由 security 于 2015-11-10 14:13 编辑

JSON貌似越来越流行了,这货出现在我的视线的次数越来越多了
不过也许是我的视野扩大了,它的分量原本就在那边
先关注下,后面看看能否用得上,谢谢。

出0入0汤圆

发表于 2015-11-10 17:21:38 | 显示全部楼层
刚好有用

出0入198汤圆

 楼主| 发表于 2015-11-10 18:30:12 | 显示全部楼层
wazhiyi 发表于 2015-11-10 09:39
单片机可以跑吗?内存耗量怎么样?

我的主要使用场景就是单片机,内存消耗能接受,主要取决于项目对处理能力的要求

出0入198汤圆

 楼主| 发表于 2015-11-10 18:35:34 | 显示全部楼层
RAMILE 发表于 2015-11-10 10:07
easyflash 补上这个功能就完美了

我觉得CSV格式列表数据密度更高点

就是在设计EasyFlash新功能时想到的再设计这样一个库。

CSV用的少,以后可以研究下。

出0入198汤圆

 楼主| 发表于 2015-11-10 18:37:51 | 显示全部楼层
myxiaonia 发表于 2015-11-10 10:26
你的EasyFlash越来越牛叉了,轻量级的sqlite

哈哈,未来的目标就是要让EasyFlash作为可应用于嵌入式平台的轻量级非关系型数据库。

出0入198汤圆

 楼主| 发表于 2015-11-10 18:41:20 | 显示全部楼层
ljt80158015 发表于 2015-11-10 13:31
原来是 “嵌入式Flash闪存库 EasyFlash ”作者,   大牛  膜拜下!

过奖~~多谢支持哈~

出0入0汤圆

发表于 2015-11-10 19:00:39 | 显示全部楼层
#在这里快速回复#楼主大牛,跟着学习了

出0入0汤圆

发表于 2015-11-10 19:01:03 | 显示全部楼层
楼主大牛,跟着学习了

出0入0汤圆

发表于 2015-11-10 19:59:23 | 显示全部楼层
帮顶  仔细看看

出0入90汤圆

发表于 2015-11-10 20:09:38 | 显示全部楼层
已经watch,已经下载

出0入0汤圆

发表于 2015-11-10 20:14:32 | 显示全部楼层
帮顶     

出0入0汤圆

发表于 2015-11-10 20:52:07 | 显示全部楼层
使用的确  方便了很多     json在物联网  用的比较多    原因是云平台  比较容易解析

出0入0汤圆

发表于 2015-11-10 20:57:00 | 显示全部楼层
大牛,膜拜一下
谢谢

出0入0汤圆

发表于 2015-11-10 21:02:04 | 显示全部楼层
4058665 发表于 2015-11-10 20:52
使用的确  方便了很多     json在物联网  用的比较多    原因是云平台  比较容易解析 ...





                        json在物联网的应用,能举一个实例吗?



出0入198汤圆

 楼主| 发表于 2015-11-10 22:57:48 | 显示全部楼层
4058665 发表于 2015-11-10 20:52
使用的确  方便了很多     json在物联网  用的比较多    原因是云平台  比较容易解析 ...


是的~与后台服务器交互也是我的一个主要使用场景。

出0入0汤圆

发表于 2015-11-10 23:12:23 来自手机 | 显示全部楼层
不明觉悟。

出0入0汤圆

发表于 2015-11-11 01:35:09 来自手机 | 显示全部楼层
json-C或者Cjson够用了

出0入0汤圆

发表于 2015-11-11 07:46:27 | 显示全部楼层
ljt80158015 发表于 2015-11-10 13:30
JSON  除了web通信,别的用的少吧

XML 很多文件存储都是这个格式

xml解析在单片机上就麻烦大了,json非常简单适合嵌入式上

出0入0汤圆

发表于 2015-11-11 08:37:28 | 显示全部楼层
mark一下,多谢分享了

出0入198汤圆

 楼主| 发表于 2015-11-11 18:30:42 | 显示全部楼层
fshunj 发表于 2015-11-11 01:35
json-C或者Cjson够用了

struct2json 功能是做C结构体与 JSON 快速互转,降低代码量,提高代码逻辑性。代码是基于cJSON库的二次封装。所以没法和其他C的JSON解析库对比的。

出0入0汤圆

发表于 2015-11-11 21:28:23 | 显示全部楼层
sunnydragon 发表于 2015-11-11 18:30
struct2json 功能是做C结构体与 JSON 快速互转,降低代码量,提高代码逻辑性。代码是基于cJSON库的二次封 ...

json-C 比cjson更强,为什么不在json-C上面二次封装

出20入0汤圆

发表于 2015-11-12 00:18:51 | 显示全部楼层
   谢谢楼主一直以来超高质量的分享

出0入198汤圆

 楼主| 发表于 2015-11-13 12:01:49 | 显示全部楼层
fshunj 发表于 2015-11-11 21:28
json-C 比cjson更强,为什么不在json-C上面二次封装


之前的产品上一直用的cJSON库,所以就延续下来了。如果大家有需要,后续完全可以再追加对json-c库的支持,需要的请跟帖加一。

出0入0汤圆

发表于 2015-11-13 12:25:01 来自手机 | 显示全部楼层
目前准备通过gprs传送数据给上位机,请问这个场景可以使用json吗?

出0入198汤圆

 楼主| 发表于 2015-11-13 12:44:26 | 显示全部楼层
changxiaoqing11 发表于 2015-11-13 12:25
目前准备通过gprs传送数据给上位机,请问这个场景可以使用json吗?

完全可以的,我的产品也是使用GPRS通信+JSON格式的协议。

但是也要看你与上位机之间协议,上位机不支持也不行的。

出0入0汤圆

发表于 2015-11-13 15:30:13 | 显示全部楼层
sunnydragon 发表于 2015-11-13 12:44
完全可以的,我的产品也是使用GPRS通信+JSON格式的协议。

但是也要看你与上位机之间协议,上位机不支持 ...

请问楼主如何验证

出0入0汤圆

发表于 2015-11-13 15:35:30 | 显示全部楼层
楼主的文件用这个软件才能打开   MarkdownPad

出0入198汤圆

 楼主| 发表于 2015-11-13 15:50:02 | 显示全部楼层

你说的“验证”指的是什么?

出0入198汤圆

 楼主| 发表于 2015-11-13 15:52:53 | 显示全部楼层
磊磊映画 发表于 2015-11-13 15:35
楼主的文件用这个软件才能打开   MarkdownPad

是的,如果想要离线查看文档就得需要安装这个软件。

在线查看可以打开下面的链接
Github:https://github.com/armink/struct2json/blob/master/docs/zh/api.md
OSChina:http://git.oschina.net/Armink/st ... ster/docs/zh/api.md

出0入0汤圆

发表于 2015-11-13 17:01:49 | 显示全部楼层
sunnydragon 发表于 2015-11-13 15:50
你说的“验证”指的是什么?

我看到了  有demo  

出0入0汤圆

发表于 2015-11-13 17:09:25 | 显示全部楼层
  1. .id = 24,
  2.             .weight = 71.2,
  3.             .score = {1, 2, 3, 4, 5, 6, 7, 8},
  4.             .name = "armink",
  5.             .hometown.name = "China",
复制代码
楼主,这种.变量的初始化结构体的方式,是C99新增的吗?
我建了个source insight 的工程 看完后清晰多了,楼主厉害!佩服

出0入0汤圆

发表于 2015-11-13 17:13:04 | 显示全部楼层
磊磊映画 发表于 2015-11-13 17:09
楼主,这种.变量的初始化结构体的方式,是C99新增的吗?
我建了个source insight 的工程 看完后清晰多了 ...

嗯,的确是  C99中叫指定初始化  

出0入0汤圆

发表于 2015-11-13 17:14:45 | 显示全部楼层
磊磊映画 发表于 2015-11-13 17:13
嗯,的确是  C99中叫指定初始化

楼主,json 如何配合AT指令使用呢?发AT指令时直接把转换好的JSON格式数据甩到串口上?

出0入0汤圆

发表于 2015-11-13 19:44:50 | 显示全部楼层
磊磊映画 发表于 2015-11-13 15:35
楼主的文件用这个软件才能打开   MarkdownPad

可以上传下软件吗?我这边无法下载。。呵呵

出0入0汤圆

发表于 2015-11-14 20:29:58 | 显示全部楼层
支持~~~~~~~~~~~~~~

出0入0汤圆

发表于 2015-11-15 10:35:24 | 显示全部楼层
怒赞。。。。。。。。。。。

出0入0汤圆

发表于 2015-11-15 12:05:41 | 显示全部楼层
好东西,学习之

出0入0汤圆

发表于 2015-11-17 14:50:43 | 显示全部楼层
向你学习!一直都在关注你。

出0入0汤圆

发表于 2015-11-17 15:19:13 | 显示全部楼层

出0入0汤圆

发表于 2015-12-9 17:51:22 | 显示全部楼层
真不错,持续关注

出0入0汤圆

发表于 2015-12-9 18:18:52 | 显示全部楼层
支持开源!


出0入0汤圆

发表于 2015-12-10 10:02:10 | 显示全部楼层
有意思啊

出0入0汤圆

发表于 2016-1-18 18:41:44 | 显示全部楼层
楼主,在吗,问个问题SIM900a如何使用HTTP=POST方式访问外网呢? POST的数据用那条指令发送啊?不像GET那么简单

出0入10汤圆

发表于 2016-1-19 15:08:20 | 显示全部楼层
sunnydragon 发表于 2015-11-10 08:13
多谢支持哈~提前透露下,EasyFlash即将发布的一个全新功能也将会用到这个struct2json,请继续关注。 ...

将结构体转化为JSON(字符)再保存到Flash

出0入8汤圆

发表于 2016-1-19 15:33:16 | 显示全部楼层
方便群众啊,不错不错,关注下!

出0入0汤圆

发表于 2016-1-27 13:44:40 来自手机 | 显示全部楼层
esp8266牛叉模块好像就用json

出0入0汤圆

发表于 2016-1-27 15:05:22 | 显示全部楼层
正好要用到 太好了

出0入0汤圆

发表于 2016-1-27 15:06:15 | 显示全部楼层
mark  物联网  智能家居好像用的比较多

出0入0汤圆

发表于 2016-1-27 16:25:31 | 显示全部楼层
正好用到。多谢。

出0入0汤圆

发表于 2016-8-12 11:52:46 | 显示全部楼层
本帖最后由 Vampireyifeng 于 2016-8-12 13:24 编辑

非常感谢楼主的开源。

出0入0汤圆

发表于 2016-8-12 12:45:18 | 显示全部楼层
正要弄这个,太有用了。

出0入0汤圆

发表于 2016-11-15 18:14:30 | 显示全部楼层
mark..........

出0入0汤圆

发表于 2016-11-16 00:41:27 来自手机 | 显示全部楼层
大神啊膜拜

出0入0汤圆

发表于 2016-11-16 08:54:23 | 显示全部楼层
这个好东西啊!!顶

出0入0汤圆

发表于 2016-11-16 17:47:25 | 显示全部楼层
在用cjson,有了这个就省事了!

出0入0汤圆

发表于 2016-11-16 18:42:05 | 显示全部楼层
不是有cjason 库玛 还需要如此大费周章

出0入198汤圆

 楼主| 发表于 2016-11-16 19:01:14 | 显示全部楼层
danielyuan 发表于 2016-11-16 18:42
不是有cjason 库玛 还需要如此大费周章

cJSON 你用了就知道了,直接使用会多很多冗余代码(请仔细看下 1楼 的使用前后对比图)。 structjson 是对 cJSON 的封装,降低代码复杂度,提升可读性。

出0入0汤圆

发表于 2016-11-30 22:32:47 | 显示全部楼层
请问和CJSON比会降低内存资源消耗吗?单片机内存比较吃紧,试着跑CJSON,刚刚凑合能用

出0入198汤圆

 楼主| 发表于 2016-12-1 08:52:31 | 显示全部楼层
nzk123 发表于 2016-11-30 22:32
请问和CJSON比会降低内存资源消耗吗?单片机内存比较吃紧,试着跑CJSON,刚刚凑合能用 ...

这个是对cJSON 的封装,底层就是 cJSON ,所以跟使用 cJSON 的平台对比,不会增加任何多余的内存开销。

出0入0汤圆

发表于 2016-12-17 10:47:13 | 显示全部楼层
sunnydragon 发表于 2015-11-10 08:13
多谢支持哈~提前透露下,EasyFlash即将发布的一个全新功能也将会用到这个struct2json,请继续关注。 ...

这个支持内部嵌套类吗?
比如
class  A{}
class B
{
    int serial;
    int name;
    class a[128];
}

出0入198汤圆

 楼主| 发表于 2016-12-17 19:41:46 | 显示全部楼层
kinsno 发表于 2016-12-17 10:47
这个支持内部嵌套类吗?
比如
class  A{}

支持的,楼主位的那个结构体就是嵌套的。

出0入0汤圆

发表于 2016-12-17 20:33:04 | 显示全部楼层
sunnydragon 发表于 2016-12-17 19:41
支持的,楼主位的那个结构体就是嵌套的。


请问:不晓得你有没有注意到,我的嵌套类是父类只是一个单独的类,而一个子类是一个类数组即class a[128],并不是一个单独的类;
这种能解析出来吗?





出0入198汤圆

 楼主| 发表于 2016-12-18 18:54:11 | 显示全部楼层
kinsno 发表于 2016-12-17 20:33
请问:不晓得你有没有注意到,我的嵌套类是父类只是一个单独的类,而一个子类是一个类数组即class a[128] ...

这块目前还挺难处理,目前还不支持结构体数组嵌套。不知道你有没有更好的办法?

出0入0汤圆

发表于 2016-12-18 19:10:30 | 显示全部楼层
sunnydragon 发表于 2016-12-18 18:54
这块目前还挺难处理,目前还不支持结构体数组嵌套。不知道你有没有更好的办法? ...


那换一个方式,请问:多个元素的是否可解析出来;
比如:class A[128] = 转换(sd读出来的string)
还是说,目前只能进行1个结构体对1个json的转换?哪怕是同一种结构体的数组也不支持。。。
PS:我还没有用CJSON,目前是在合适的方式,因为我要用到结构体数组,想了解一下JSON;



出0入0汤圆

发表于 2016-12-20 22:16:01 | 显示全部楼层
这个好东西啊!!赞一个!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-12-11 12:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表