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