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

    浏览量

    7915
  • OpenHarmony
    +关注

    关注

    25

    文章

    3665

    浏览量

    16161

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

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

收藏 人收藏

    评论

    相关推荐

    Type-C充电速度与传统接口对比

    特性,迅速智能手机、笔记本电脑、平板电脑等设备上得到广泛应用。与传统的USB接口相比,Type-C接口充电速度上具有明显优势。 接口设计 Type-
    的头像 发表于 10-28 13:58 373次阅读

    AI大模型传统机器学习的区别

    AI大模型传统机器学习多个方面存在显著的区别。以下是对这些区别的介绍: 一、模型规模与复杂度 AI大模型 :通常包含数十亿甚至数万亿的参
    的头像 发表于 10-23 15:01 389次阅读

    启明智显AI大模型解决方案加速传统玩具智能升级,WIFI、4G便捷连网

    启明智显凭借前沿、低成本的AI大模型解决方案催化传统玩具行业的革新,“高清显示+AI大模型”将传统玩具升级为集智能、情感、个性化于一体的智能玩伴。
    的头像 发表于 08-21 10:07 385次阅读
    启明智显AI大<b class='flag-5'>模型</b>解决方案加速<b class='flag-5'>传统</b>玩具智能升级,WIFI、4G便捷连网

    使用CJSON创建数字是一直是显示0,为什么?

    使用CJSON创建字符没有问题,但是创建数字是一直是显示0,代码如下: /* * Create a json format data */ root = cJSON
    发表于 07-22 07:02

    ai大模型传统ai的区别在哪?

    AI大模型传统AI的区别主要体现在以下几个方面: 数据量和训练规模 AI大模型通常需要大量的数据进行训练,以获得更好的性能。相比之下,传统AI模型
    的头像 发表于 07-16 10:06 1207次阅读

    AI大模型传统AI的区别

    AI大模型(如LLM,即大型语言模型)与传统AI多个方面存在显著的区别。以下将从技术层面、应用场景、性能表现、计算资源和成本、以及发展趋势和挑战等角度进行详细阐述。
    的头像 发表于 07-15 11:37 2356次阅读

    使用cJSON_AddNumberToObjectcJSON_Print命令期间ESP8266崩溃了的原因?

    IDF 版本 3.4 发布 问题:使用cJSON_AddNumberToObjectcJSON_Print命令期间使ESP8266崩溃。 ESP32 上正确执行的相同代码。 vo
    发表于 07-08 08:03

    请问电脑端Pytorch训练的模型如何转化为能在ESP32S3平台运行的模型

    由题目, 电脑端Pytorch训练的模型如何转化为能在ESP32S3平台运行的模型? 如何把这个Pytorch模型烧录到ESP32S3上去?
    发表于 06-27 06:06

    esp-idf v4.1 SDK使用cjson时编译报错是什么原因导致的?

    你好,最近准备从ESP-IDF V3.3迁移到V4.1,现在添加了cJSON后,工程编译不过去,我查看了SDK中是有这个component的,我工程中也添加了头文件,但不知道为何编译不过去,麻烦
    发表于 06-24 09:22

    8266 rtos3.4中使用cJSON_AddNumberToObject添加的数值为空,cJSON_Print输出报错的原因?

    8266 rtos3.4中使用cJSON_AddNumberToObject添加的数值为空,cJSON_Print输出报错,哪位大佬遇见过类似的问题
    发表于 06-18 06:31

    【大语言模型:原理与工程实践】大语言模型的应用

    类任务上表现出色,甚至零样本条件下也能取得良好效果。另一类则需要逐步推理才能完成的任务,类似于人类的系统2,如数字推理等。然而,随着参数量的增加,大语言模型在这类任务上并未出现质的飞跃,除非有精心
    发表于 05-07 17:21

    rtthread中使用cJSON转float时报错怎么解决?

    ; cJSON_AddNumberToObject(root,\"runSpeed\",jxs); out=cJSON_Print(root); cJSON_Delete(root); LOG_D(\"%
    发表于 03-05 06:33

    Groq推出大模型推理芯片 超越了传统GPU和谷歌TPU

    Groq推出了大模型推理芯片,以每秒500tokens的速度引起轰动,超越了传统GPU和谷歌TPU。
    的头像 发表于 02-26 10:24 977次阅读
    Groq推出大<b class='flag-5'>模型</b>推理芯片 超越了<b class='flag-5'>传统</b>GPU和谷歌TPU

    【吃灰开发板复活】DIY全志V3s随身终端屏幕适配,LVGL以及各种外设驱动移植教程

    ); if(cJSON_IsString(text)) {lv_label_set_text_fmt(label1, "当前天气\n%s", text-&gt
    发表于 01-22 09:58

    模型智能服务领域的落地要点

    传统“小”模型方法中,需要对训练数据进行构建,例如训练一个分类模型,以便将用户的问题分类为不同的意图。同样,回答用户问题的方式也需要模型
    发表于 12-04 14:28 552次阅读