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

【RA-Eco-RA4M2開發(fā)板評測】在RA4M2上移植使用cJSON
PCBA生產(chǎn)注意事項

TPA3140D2 EMC設(shè)計注意事項

脈沖式充電器的使用注意事項
智能高端開關(guān)的故障和正常診斷注意事項

評論