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

    浏览量

    8689
  • OpenHarmony
    +关注

    关注

    31

    文章

    3926

    浏览量

    20723

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    如何在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 492次阅读
    【NCS随笔】NCS使用<b class='flag-5'>CJSON</b>库

    【RA-Eco-RA4M2开发板评测】RA4M2上移植使用cJSON

    大家先把它下载下来 我们只需要使用其中的两个文件cJSON.ccJSON.h,其它的删除 1。先把cJSON复制到串口工程目录下,KEIL中添加路劲和文件。建立串口我之前写了很多
    发表于 05-04 13:40

    ZED75-48S48C-H ZED75-48S48C-H

    电子发烧友网为你提供AIPULNION(AIPULNION)ZED75-48S48C-H相关产品参数、数据手册,更有ZED75-48S48C-H的引脚图、接线图、封装手册、中文资料、英文资料,ZED75-48S48C-H真值表,
    发表于 03-21 18:53
    ZED75-48<b class='flag-5'>S48C</b>-H ZED75-48<b class='flag-5'>S48C</b>-H

    FW2-24S15C3 FW2-24S15C3

    电子发烧友网为你提供AIPULNION(AIPULNION)FW2-24S15C3相关产品参数、数据手册,更有FW2-24S15C3的引脚图、接线图、封装手册、中文资料、英文资料,FW2-24S15C3真值表,FW2-24
    发表于 03-20 18:30
    FW2-24<b class='flag-5'>S15C</b>3 FW2-24<b class='flag-5'>S15C</b>3

    为什么无法S32K396-BGA-DC1评估板上运行MBDT s32k3xx_dio_ebt示例?

    问题地安装工具箱,但我无法运行s32k3xx_dio_ebt示例。 我认为我模型的参数中设置了正确的目标 我正在使用安装在电路板上的“Open SDA”调试器。跳线 J16、J17、J18
    发表于 03-20 07:16

    FW2-24S15C FW2-24S15C

    电子发烧友网为你提供AIPULNION(AIPULNION)FW2-24S15C相关产品参数、数据手册,更有FW2-24S15C的引脚图、接线图、封装手册、中文资料、英文资料,FW2-24S15C真值表,FW2-24
    发表于 03-19 18:58
    FW2-24<b class='flag-5'>S15C</b> FW2-24<b class='flag-5'>S15C</b>

    CL5-220S05C CL5-220S05C

    电子发烧友网为你提供AIPULNION(AIPULNION)CL5-220S05C相关产品参数、数据手册,更有CL5-220S05C的引脚图、接线图、封装手册、中文资料、英文资料,CL5-220S05C真值表,CL5-220
    发表于 03-18 18:40
    CL5-220<b class='flag-5'>S05C</b> CL5-220<b class='flag-5'>S05C</b>

    NVIDIA大语言模型推荐系统中的应用实践

    推荐系统的主要任务在于根据用户的过往行为预测其潜在兴趣点,并据此推荐相应的商品。传统的推荐系统中,当处理用户请求时,会触发多个召回模块,例如热门商品召回、个性化召回以及深度召回等,从而召回大量候选
    的头像 发表于 03-05 09:30 1460次阅读
    NVIDIA大语言<b class='flag-5'>模型</b><b class='flag-5'>在</b>推荐系统中的应用实践

    为什么无法在运行时C++推理中读取OpenVINO™模型

    使用模型优化器 2021.1 版OpenVINO™转换模型 使用 Runtime 2022.3 版本 C++ 推理实现 ( core.read_model()) 中读取
    发表于 03-05 06:17

    Type-C母座的普及:传统接口还能坚持多久?

    Type-C母座作为一种新型的接口技术,近年来逐渐取代了传统接口,消费电子、智能设备等领域取得了显著的市场份额。那么,Type-C母座为
    的头像 发表于 02-26 16:02 1090次阅读
    Type-<b class='flag-5'>C</b>母座的普及:<b class='flag-5'>传统</b>接口还能坚持多久?

    C#集成OpenVINO™:简化AI模型部署

    开源测控、机器视觉、数采与分析三大领域中,如何快速将AI模型集成到应用程序中, 实现AI赋能和应用增值? 最容易的方式是:C#中,使用 OpenVINO工具套件 集成AI
    的头像 发表于 02-17 10:03 2523次阅读
    <b class='flag-5'>C</b>#集成OpenVINO™:简化AI<b class='flag-5'>模型</b>部署

    C#中使用OpenVINO™:轻松集成AI模型

    与分析三大领域中,如何快速将AI模型集成到应用程序中,实现AI赋能和应用增值?最容易的方式是:C#中,使用OpenVINO™工具套件集成AI模型。 一,什么是OpenVINO™ 工具
    的头像 发表于 02-07 14:05 1656次阅读
    <b class='flag-5'>C</b>#中使用OpenVINO™:轻松集成AI<b class='flag-5'>模型</b>!