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/cJSON3. 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. 數據打包過程

數據包在上傳到服務器之前需要封裝成JSON格式,然后通過網絡傳輸。因此,需要創建一個cJSON類型的對象,然后調用cJSON_AddStringToObject()函數,向對象添加信息的屬性值,此時通過調用 cJSON_Print()的函數將對象的屬性解析到緩存中,這里可以認為將cJSON對象序列化為字符串,所以實際上,緩存中存儲了一個字符串。此時,可以根據Ascii代碼表將緩存的Ascii值順序轉換為十六進制數。最后,將十六進制數發送到服務器后,至此打包工作完成。
5. 解析數據包過程

同樣,在服務器將信息發送給客戶端后,需要根據協議的格式對數據包進行適當的分析。因此,此時調用cJSON_Parse()函數來解析來自服務器的JSON數據包,此外,還需要創建cJSON的對象來接收解析后的數據,最后,使用JSON_GetObjectItem()的函數來獲取cJSON對象的不同屬性值,這樣就完成了數據包的解包工作。需要注意的是,在處理數據后,必須調用cJSON_Delete()函數來釋放創建的對象。否則會導致內存泄漏,并導致系統不穩定。
6.代碼庫位置
大家是不是躍躍欲試,想看代碼?如果希望尋找OpenHarmony引用的第三方開源庫,只需要在Gitee上全局搜索OpenHarmony third party+相關領域關鍵術語。
OpenHarmony跟JSON相關的庫,就是全局搜索OpenHarmony third party json字段。
<本文完>
寫在最后
OpenHarmony 成長計劃—“啃論文俱樂部”(以下簡稱“啃論文俱樂部”)是在 2022年 1 月 11 日的一次日常活動中誕生的。截至 3 月 31 日,啃論文俱樂部已有 87 名師生和企業導師參與,目前共有十二個技術方向并行探索,每個方向都有專業的技術老師帶領同學們通過啃綜述論文制定技術地圖,按“降龍十八掌”的學習方法編排技術開發內容,并通過專業推廣培養高校開發者成為軟件技術學術級人才。
啃論文俱樂部的宗旨是希望同學們在開源活動中得到軟件技術能力提升、得到技術寫作能力提升、得到講解技術能力提升。大學一年級新生〇門檻參與,已有俱樂部來自多所高校的大一同學寫出高居榜首的技術文章。
如今,搜索“啃論文”,人們不禁想到、而且看到的都是我們——OpenHarmony 成長計劃—“啃論文俱樂部”的產出。
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
現在,你是不是也熱血沸騰,摩拳擦掌地準備加入這個俱樂部呢?當然歡迎啦!啃論文俱樂部向任何對開源技術感興趣的大學生開發者敞開大門。
掃碼添加 OpenHarmony 高校小助手,加入“啃論文俱樂部”微信群
后續,我們會在服務中心公眾號陸續分享一些 OpenHarmony 開源與開發者成長計劃—“啃論文俱樂部”學習心得體會和總結資料。記得呼朋引伴來看哦。

原文標題:cJSON在傳統C/S模型的應用
文章出處:【微信公眾號:開源技術服務中心】歡迎添加關注!文章轉載請注明出處。
-
開源技術
+關注
關注
0文章
389瀏覽量
8121 -
OpenHarmony
+關注
關注
27文章
3835瀏覽量
18179
原文標題:cJSON在傳統C/S模型的應用
文章出處:【微信號:開源技術服務中心,微信公眾號:共熵服務中心】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
【RA-Eco-RA4M2開發板評測】在RA4M2上移植使用cJSON
ZED75-48S48C-H ZED75-48S48C-H

FW2-24S15C3 FW2-24S15C3

FW2-24S15C FW2-24S15C

CL5-220S05C CL5-220S05C

AI大模型與傳統機器學習的區別
啟明智顯AI大模型解決方案加速傳統玩具智能升級,WIFI、4G便捷連網

評論