0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

cJSON在传统C/S模型的应用

共熵服务中心 来源:未知 2022-11-24 19:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

8c8a5e28-6be9-11ed-8abf-dac502259ad0.png

文章转发自51CTO 开源基础软件社区 OpenHarmony成长计划啃论文俱乐部【FFH】啃论文俱乐部---JSON压缩算法解读

1.关于作者

大家好!我是来自深圳技术大学FSR Lab(编者注:Falcon Swarm Robotics Lab猎鹰集群机器人控制实验室的缩写)的同学HagonChan,陈汉武,标题FFH就是FSRlab For Harmony!并且我也正在参加OpenHarmony成长计划从论文到开源提交研究,以后我们也会陆续在这个社区记录学习心得和体会。

在OpenHarmony成长计划啃论文俱乐部里,FFH小组同学们与华为、软通动力、润和软件、拓维信息、深开鸿等公司一起,学习和研究序列化相关技术…

2. 前言

cJSON是一个用在底层数据通信的一个C语言的JSON数据解析库。比如在一个系统底层使用socket方式进行通信的时候,通信两端就可以用cJSON对传递的JSON数据对象进行处理,下面我们来看看一篇关于cJSON在传统C/S(Client/Server)模型的应用。

cJSON github 开源地址如下:https://github.com/DaveGamble/cJSON

3. cJSON结构体分析

我们来看看cJSON的源码的结构体部分:

/* The cJSON structure: */
typedef struct cJSON
{
    struct cJSON *next;
    struct cJSON *prev;
    struct cJSON *child;
    int type;
    char *valuestring;
    int valueint;
    double valuedouble;
    char *string;
} cJSON;
  • *next/*prev:指向下一条/上一条键值对(key-value)节点。

  • type:表示该键值对节点中值的数据类型。

  • *valuestring/valueint/valuedouble:如果type为字符串/整型/浮点数类型,则其指向该键值。

  • *string:用于存储所有键(key)的名称,包括child中的key。

  • *child:当值类型为复杂数据结构,如数组,对象,嵌套JSON等等,则该指针指向该键值。

可以看到cJSON是通过链表来存储JSON数据的,这个设计比较巧妙,相较于JSONcpp,cJSON可以保证写入的数据和输出的数据的顺序保持一致,而JSONcpp则不能保证写入和输出的顺序一致性,因为在存储的时候JSONcpp会按照key-value进行内部排序。所以对于一些要求JSON数据顺序的业务,cJSON相对于JSONcpp就是一个更好的选择。

通过这个数据结构我们也可以知道每一个JSON对象里面的键值对都通过next和prev指针链接相邻的键值对节点,以保证我们刚刚说的数据顺序。

从这个数据结构我们还能看到另外一个巧妙地地方,就是*child指针,这个指针让这个cJSON支持复杂数据结构,比如数组,对象,嵌套JSON数据对象等。

cJSON的主要功能接口
功能接口 特性
cJSON_CreateObject() 生成一个JSON类型的对象
cJSON_AddStringToObject() 给JSON对象添加结构属性
cJSON_GetObjectItem() 获取JSON对象每个属性的值
cJSON_Print() 将JSON对象的属性解析到缓存中
cJSON_Parse() 字符串被解析为JSON对象
cJSON_Delete() 释放创建的JSON对象

如上表,cJSON库里面有很多函数方法,可以进行一系列创建以及处理JSON对象的操作。

4. 数据打包过程

8cb1f118-6be9-11ed-8abf-dac502259ad0.png

数据包在上传到服务器之前需要封装成JSON格式,然后通过网络传输。因此,需要创建一个cJSON类型的对象,然后调用cJSON_AddStringToObject()函数,向对象添加信息的属性值,此时通过调用 cJSON_Print()的函数将对象的属性解析到缓存中,这里可以认为将cJSON对象序列化为字符串,所以实际上,缓存中存储了一个字符串。此时,可以根据Ascii代码表将缓存的Ascii值顺序转换为十六进制数。最后,将十六进制数发送到服务器后,至此打包工作完成。

5. 解析数据包过程

8cdfe29e-6be9-11ed-8abf-dac502259ad0.png

同样,在服务器将信息发送给客户端后,需要根据协议的格式对数据包进行适当的分析。因此,此时调用cJSON_Parse()函数来解析来自服务器的JSON数据包,此外,还需要创建cJSON的对象来接收解析后的数据,最后,使用JSON_GetObjectItem()的函数来获取cJSON对象的不同属性值,这样就完成了数据包的解包工作。需要注意的是,在处理数据后,必须调用cJSON_Delete()函数来释放创建的对象。否则会导致内存泄漏,并导致系统不稳定。

6.代码库位置

大家是不是跃跃欲试,想看代码?

如果希望寻找OpenHarmony引用的第三方开源库,只需要在Gitee上全局搜索OpenHarmony third party+相关领域关键术语。

OpenHarmony跟JSON相关的库,就是全局搜索OpenHarmony third party json字段。

8d0f92be-6be9-11ed-8abf-dac502259ad0.png

<本文完>

写在最后

OpenHarmony 成长计划—“啃论文俱乐部”(以下简称“啃论文俱乐部”)是在 2022年 1 月 11 日的一次日常活动中诞生的。截至 3 月 31 日,啃论文俱乐部已有 87 名师生和企业导师参与,目前共有十二个技术方向并行探索,每个方向都有专业的技术老师带领同学们通过啃综述论文制定技术地图,按“降龙十八掌”的学习方法编排技术开发内容,并通过专业推广培养高校开发者成为软件技术学术级人才。

啃论文俱乐部的宗旨是希望同学们在开源活动中得到软件技术能力提升、得到技术写作能力提升、得到讲解技术能力提升。大学一年级新生〇门槛参与,已有俱乐部来自多所高校的大一同学写出高居榜首的技术文章。

如今,搜索“啃论文”,人们不禁想到、而且看到的都是我们——OpenHarmony 成长计划—“啃论文俱乐部”的产出。

8d3978ae-6be9-11ed-8abf-dac502259ad0.jpg

8d57df38-6be9-11ed-8abf-dac502259ad0.jpg

8d6c39ec-6be9-11ed-8abf-dac502259ad0.jpg

OpenHarmony开源与开发者成长计划—“啃论文俱乐部”学习资料合集

1)入门资料:啃论文可以有怎样的体验

https://docs.qq.com/slide/DY0RXWElBTVlHaXhi?u=4e311e072cbf4f93968e09c44294987d

2)操作办法:怎么从啃论文到开源提交以及深度技术文章输出https://docs.qq.com/slide/DY05kbGtsYVFmcUhU

3)企业/学校/老师/学生为什么要参与 & 啃论文俱乐部的运营办法https://docs.qq.com/slide/DY2JkS2ZEb2FWckhq

4)往期啃论文俱乐部同学分享会精彩回顾:

同学分享会No1.成长计划啃论文分享会纪要(2022/02/18)https://docs.qq.com/doc/DY2RZZmVNU2hTQlFY

同学分享会No.2 成长计划啃论文分享会纪要(2022/03/11)https://docs.qq.com/doc/DUkJ5c2NRd2FRZkhF

同学们分享会No.3 成长计划啃论文分享会纪要(2022/03/25)

https://docs.qq.com/doc/DUm5pUEF3ck1VcG92?u=4e311e072cbf4f93968e09c44294987d

现在,你是不是也热血沸腾,摩拳擦掌地准备加入这个俱乐部呢?当然欢迎啦!啃论文俱乐部向任何对开源技术感兴趣的大学生开发者敞开大门。

8dc3045c-6be9-11ed-8abf-dac502259ad0.png

扫码添加 OpenHarmony 高校小助手,加入“啃论文俱乐部”微信群

后续,我们会在服务中心公众号陆续分享一些 OpenHarmony 开源与开发者成长计划—“啃论文俱乐部”学习心得体会和总结资料。记得呼朋引伴来看哦。

8dd82044-6be9-11ed-8abf-dac502259ad0.gif

8ded88e4-6be9-11ed-8abf-dac502259ad0.png

8e3e68b8-6be9-11ed-8abf-dac502259ad0.png

8e55b004-6be9-11ed-8abf-dac502259ad0.png

8eb28310-6be9-11ed-8abf-dac502259ad0.png

8ee38e92-6be9-11ed-8abf-dac502259ad0.png

8efaa4e2-6be9-11ed-8abf-dac502259ad0.png

8f202b90-6be9-11ed-8abf-dac502259ad0.png

8f3e134e-6be9-11ed-8abf-dac502259ad0.png

8f57c60e-6be9-11ed-8abf-dac502259ad0.png

8f6a5f26-6be9-11ed-8abf-dac502259ad0.png

8f7e1d18-6be9-11ed-8abf-dac502259ad0.png

8f953bec-6be9-11ed-8abf-dac502259ad0.png

8fb1cd98-6be9-11ed-8abf-dac502259ad0.png

8fd91eb6-6be9-11ed-8abf-dac502259ad0.png

8fea573a-6be9-11ed-8abf-dac502259ad0.png

90040a5e-6be9-11ed-8abf-dac502259ad0.png

902f9cd2-6be9-11ed-8abf-dac502259ad0.png

90424ae4-6be9-11ed-8abf-dac502259ad0.png

908e0560-6be9-11ed-8abf-dac502259ad0.png

90a8bc84-6be9-11ed-8abf-dac502259ad0.png

90cf6190-6be9-11ed-8abf-dac502259ad0.png

9134e68c-6be9-11ed-8abf-dac502259ad0.png

917223da-6be9-11ed-8abf-dac502259ad0.png

919bc7f8-6be9-11ed-8abf-dac502259ad0.png

91cab5d6-6be9-11ed-8abf-dac502259ad0.png

91e06192-6be9-11ed-8abf-dac502259ad0.png

925083e6-6be9-11ed-8abf-dac502259ad0.png


原文标题:cJSON在传统C/S模型的应用

文章出处:【微信公众号:开源技术服务中心】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开源技术
    +关注

    关注

    0

    文章

    389

    浏览量

    8764
  • OpenHarmony
    +关注

    关注

    33

    文章

    3974

    浏览量

    21353

原文标题:cJSON在传统C/S模型的应用

文章出处:【微信号:开源技术服务中心,微信公众号:共熵服务中心】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LCD 屏幕上的文本区域和 ddlist 更新时闪烁是为什么?

    我正在尝试我的 LCD 处理程序中更新 LCD 屏幕下方的几个文本区域。 val = cJSON_GetObjectItem(root, \"
    发表于 04-13 08:23

    S32K344如何配置 MCAL 和应用层模型

    我想使用 S32DS 配置工具 simulink(MBD) 开发 CAN Receive 项目S32K344。我 MBDT 中尝试了这个例子,但经过编程,它并没有实现我想要的功能。您能否建议我应该如何配置 MCAL 和应用层
    发表于 04-01 06:38

    摩尔线程MTT S5000全面适配Qwen3.5三款新模型

    第一时间做出极速响应,宣布已在旗舰级AI训推一体全功能GPU MTT S5000上,完成对这三款全新模型的全方位适配。   此次高效支持充分展示了摩尔线程MUSA生态的成熟度与完备性。本次Qwen3.5
    的头像 发表于 02-26 16:23 751次阅读

    沐曦曦云C500/C550 GPU产品深度适配MiniMax M2.5模型

    2月13日晚间,MiniMax正式开源MiniMax M2.5模型。沐曦技术团队依托MXMACA软件栈,24小时内完成曦云C500/C550 对该
    的头像 发表于 02-26 14:19 1119次阅读

    【ESP32-C3系列】WT32C3-S1/S2模组规格书

    概述WT32C3-S1和WT32C3-S2是通用型Wi-Fi和低功耗蓝牙(BluetoothLE)模组,是一款低功耗高性价比的嵌入式无线网络控制模块。可满足智能电网、楼宇自动化、安防、智能家居、远程
    的头像 发表于 02-03 18:15 661次阅读
    【ESP32-<b class='flag-5'>C</b>3系列】WT32<b class='flag-5'>C3-S</b>1/<b class='flag-5'>S</b>2模组规格书

    cJSON库是什么?

    cJSON库是什么?cJSON是一个轻量级的json解析库。使用起来非常简单,整个库非常地简洁,核心功能的实现都在cJSON.c文件,非常适合阅读源代码来学习C语言。最近读完这个库的源
    发表于 01-29 07:13

    【ESP32-C3系列】WT32C3-S1/S2模组产品介绍

    ✦₊点击上方名片关注了解更多概述WT32C3-S1和WT32C3-S2是通用型Wi-Fi和低功耗蓝牙(BluetoothLE)模组,是一款低功耗高性价比的嵌入式无线网络控制模块。可满足智能电网、楼宇
    的头像 发表于 01-26 18:15 620次阅读
    【ESP32-<b class='flag-5'>C</b>3系列】WT32<b class='flag-5'>C3-S</b>1/<b class='flag-5'>S</b>2模组产品介绍

    以下嵌入式软件设计模型中,属于数据流模型的是,哪里有设计模型的介绍?

    以下嵌入式软件设计模型中,属于数据流模型的是()。A. CCSB. CSPC. FSMD. Petri Net
    发表于 11-24 15:55

    谷歌与耶鲁大学合作发布最新C2S-Scale 27B模型

    我们很荣幸发布与耶鲁大学合作研究的 Cell2Sentence-Scale 27B (C2S-Scale),这是一个新的 270 亿参数基础模型,旨在理解单个细胞的 "语言"。C2S-Scale 建立
    的头像 发表于 11-06 10:35 1012次阅读

    如何在vivadoHLS中使用.TLite模型

    本帖欲分享如何在vivadoHLS中使用.TLite模型Vivado HLS中导入模型后,需要设置其输入和输出接口以与您的设计进行适配。 1. Vivado HLS项目中导入
    发表于 10-22 06:29

    cJSON_Parse返回为空,有长度限制是什么原因?

    // 解析JSON cJSON *root = cJSON_Parse(json_str); if (!root) { const char *error_ptr
    发表于 09-11 06:28

    【NCS随笔】NCS使用CJSON

    【NCS随笔】NCS使用CJSON库 这个文章讲一下NCS上面如何使用JSON库,我使用Hello_world例程添加库 宏的配置 CONFIG_LOG =y
    的头像 发表于 08-13 15:12 749次阅读
    【NCS随笔】NCS使用<b class='flag-5'>CJSON</b>库

    请问如何在C++中使用NPU上的模型缓存?

    无法确定如何在 C++ 中的 NPU 上使用模型缓存
    发表于 06-24 07:25

    ON Semiconductor RB521S30T1G参数特性与EDA模型 数据手册介绍

    ON Semiconductor RB521S30T1G参数特性与EDA模型 数据手册介绍
    的头像 发表于 05-28 16:45 1.6w次阅读
    ON Semiconductor RB521<b class='flag-5'>S</b>30T1G参数特性与EDA<b class='flag-5'>模型</b> 数据手册介绍

    施耐德电气Altivar 1200C-S中压变频器化工与储能领域的应用

    施耐德电气全新一代Altivar 1200C-S中压变频器(以下简称ATV1200C-S中压变频器)延续石化、矿业、冶金、市政行业中"变"出新高度的势头,化工与储能两大领域也持续发
    的头像 发表于 05-27 10:29 1666次阅读