前言
在STM32 OTA例程中,設備端(STM32F769探索板)與云端交換數據使用的是JSON格式。在本篇文章中,將對JSON格式以及cJSON的使用及注意事項進行說明。
JSON格式
JSON(JavaScript Object Notation)是一個輕量級的數據交換格式。既便于開發(fā)者讀寫,也便于機器分析和構建。它獨立于開發(fā)語言,是一種文本格式,很適用描述在各個系統(tǒng)間交換的數據。
JSON格式的數據看起來就像下面這個樣子:
這個JSON數據描述的是Room1的LED燈狀態(tài)以及溫度值。它由一組“名稱(key)”以及對應的“ 值(value)”組成。“名稱”和“ 值”之間由“ :”分開。各組“名稱:值”對之間由“,”符號進行分割。
cJSON的使用
針對不同的開發(fā)語言,網上有很多JSON的實現(xiàn), demo里使用的是cJSON,版本1.6。它的源碼可以在
https://github.com/DaveGamble/cJSON上下載。
01將cJSON添加到工程
cJSON只有一個C文件cJSON.c和一個頭文件cJSON.h。所以只需要將這兩個文件拷貝到工程文件夾中,并將cJSON.c添加到工程中就可以了。
02數據結構
cJSON中使用下面的數據結構來表示JSON數據
*next和*prev 指針可以用來遍歷“矩陣”或者“對象”類型的JSON數據鏈表;這兩種類型的JSON數據還會有一個子數據指針*child
type : 表示該JSON數據的類型,比如數字,字符串、矩陣、對象等
*valuestring, valueint, valuedouble和*string指針分別指向該JSON數據類型具體的值,視其類型而定。
03使用cJSON生成JSON數據
下面我們看看如何使用cJSON來生成下面的數據:
見下面的代碼:
現(xiàn)在就已經在cJSON中,構件好了和前面的數據對應的數據結構。但現(xiàn)在這個數據結構還不能發(fā)送出去,需要調用cJSON_Print將其打印成串行的數據,存放在buffer中,以便后面進行發(fā)送。
cJSON_Print執(zhí)行的時候會向系統(tǒng)申請一段內存來保存串行化了的數據,并返回其指針。這里一定要注意的是,cJSON_Print中申請的內存,一定要記得釋放(cJSON的代碼中不會自動去做釋放動作),否則就會出現(xiàn)內存泄漏。
通過cJSON_CreateObject創(chuàng)建的對象,也需要調用cJSON_Delete來進行刪除并釋放占用的內存。否則也會出現(xiàn)內存泄漏。見下面的代碼:
仔細的同學可能會發(fā)現(xiàn)為什么調用了兩次cJSON_CreateObject,但只看到釋放了其中的device_obj。這里也是需要注意的一個地方,從前面的代碼中,我們可以看到,reported_obj最終是作為子對象添加到了device_obj中,所以在刪除device_obj時,cJSON_Delete會自動刪除device_obj中所有的子對像,故而不需要再調用cJSON_Delete對reported_obj進行刪除。
04使用cJSON解析JSON數據
可以通過cJSON_Parse()函數來解析接收到的JSON數據,cJSON_Parse()函數會對數據進行解析,并申請一段內存保存解析后的cJSON的數據結構,并返回指針。
通過cJSON_GetObjectItem()函數可以獲取解析后的cJSON數據結構中的第一級子對象。
使用cJSON_Parse()后,切記也一定要通過cJSON_Delete釋放之前所申請的內存。
下面代碼是對收到的JSON數據的解析過程。收到的數據內容為:
總結
cJSON代碼量不大,用起來也方便。使用的時候一定要注意前面提到對使用完的內存空間進行釋放。否則會造成內存泄漏。
-
STM32
+關注
關注
2270文章
10906瀏覽量
356518 -
JSON
+關注
關注
0文章
119瀏覽量
6980
原文標題:STM32 FOTA例程之cJSON:就問你會不會使用!
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論