国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【嵌入式開源庫:cJSON】 一個輕量級C語言JSON數(shù)據(jù)解析庫用法詳解

這篇具有很好參考價值的文章主要介紹了【嵌入式開源庫:cJSON】 一個輕量級C語言JSON數(shù)據(jù)解析庫用法詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

cJSON簡介

cJSON是使用C語言編寫,用來創(chuàng)建、解析JSON文件的庫。cJSON特點就是工程文件簡單,只有一個.c一個.h,但提供函數(shù)接口功能齊全,麻雀雖小五臟俱全,使得在嵌入式工程中使用起來得心應手。

cJSON獲取

https://github.com/DaveGamble/cJSON
只需拉取cJSON.ccJSON.h即可。

【嵌入式開源庫:cJSON】 一個輕量級C語言JSON數(shù)據(jù)解析庫用法詳解

cJSON解析

給出如下JSON格式示例

{
	 "messageType": 2,
	 "messageId": "16493268950279230864908057508987",
	 "imei": "864908057508987898607B1192180035422",
	 "iccid": "898607B1192180035422",
	 "reportTime": "2022-12-16 15:49:00",
 	 "gpsData":
 	 [
 	 		{
 	 			"Longitude":31.23453232,
 	 			"Latitude":118.45345431
			},
			{
				"Longitude":31.23453245,
 	 			"Latitude":118.45345443
			}
			{
				"Longitude":31.23453255,
 	 			"Latitude":118.45345453
			}
   	  ]
}

1、先創(chuàng)建根節(jié)點指針

cJSON *root = NULL;
root = cJSON_Parse(msg);

cJSON其實是個結(jié)構體類型,被定義如下,cJSON_Parse接口拿到我們的msg數(shù)據(jù)后會創(chuàng)建一個cJSON結(jié)構實例,我們創(chuàng)建的cJSON結(jié)構體指針root,會指向這個cJSON結(jié)構體實例。既然是實例,就會申請內(nèi)存。所以最后我們一定要釋放掉這塊內(nèi)存,否則將導致內(nèi)存泄漏

/* The cJSON structure: */
typedef struct cJSON
{
    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
    struct cJSON *next;
    struct cJSON *prev;
    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
    struct cJSON *child;

    /* The type of the item, as above. */
    int type;

    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
    char *valuestring;
    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
    int valueint;
    /* The item's number, if type==cJSON_Number */
    double valuedouble;

    /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
    char *string;
} cJSON;

cJSON結(jié)構體其實是一個抽象的鍵值對。
他通過成員:前節(jié)點、后節(jié)點、子節(jié)點,來實現(xiàn)JSON結(jié)構的嵌套,JSON結(jié)構最終在內(nèi)存中是以一個鏈表的形式存在。

struct cJSON *next; //前節(jié)點
struct cJSON *prev; //后節(jié)點
struct cJSON *child;//子節(jié)點

而每個節(jié)點通過以下成員存儲鍵值

char *valuestring;
int valueint;
double valuedouble;

2、獲取鍵值對

是int類型鍵值就指向valueint,是字符串類型指向valuestring,字符串數(shù)據(jù)我們可以用strcpy拷貝出來

cJSON *msgType = NULL;
msgType = cJSON_GetObjectItem(root , "messageType" );
int type = msgType ->valueint

char id[21];
cJSON *iccid = NULL;
iccid = cJSON_GetObjectItem(root , "iccid" );
strcpy(id, iccid ->valuestring);

3、獲取數(shù)組

如果出現(xiàn)像示例中gpsData這種JSON數(shù)組,數(shù)組下面又嵌套著新的JSON數(shù)據(jù)的,我們將使用以下API

cJSON* gpsDataArray = NULL;
cJSON* gpsPoint = NULL;
int gpsArraySize = 0;
double Longitude = 0//經(jīng)度
double Latitude = 0 //緯度

gpsDataArray = cJSON_GetObjectItem(root, "gpsData");
gpsArraySize = cJSON_GetArraySize(gpsDataArray);
for(i = 0; i < gpsArraySize ; i++)
{
    gpsPoint = cJSON_GetArrayItem(gpsDataArray , i);
    
    Longitude = cJSON_GetObjectItem(gpsPoint , "Longitude");
    Latitude = cJSON_GetObjectItem(gpsPoint , "Latitude");
}

4、釋放內(nèi)存 !

cJSON_Delete(root);

cJSON組裝

現(xiàn)在我們試圖組裝《cJSON解析》中的示例

1、同樣,創(chuàng)建根節(jié)點

 cJSON* root = NULL;
 root = cJSON_CreateObject();

2、添加鍵值對成員

cJSON_AddNumberToObject(root , "messageType", 2);

cJSON_AddStringToObject(root , "messageId", "16493268950279230864908057508987");
cJSON_AddStringToObject(root , "imei", 		"864908057508987898607B1192180035422");
cJSON_AddStringToObject(root , "iccid", 	"898607B1192180035422");
cJSON_AddStringToObject(root , "reportTime","2022-12-16 15:49:00");

3、添加數(shù)組

和解析相反,我們應該先創(chuàng)建gps點,然后把點添加到數(shù)組,再把數(shù)組添加到根節(jié)點

	//先創(chuàng)建3個gps點
    cJSON* gpsData1 = NULL;
    gpsData2 = cJSON_CreateObject();
    cJSON_AddNumberToObject(gpsData1 ,"Longitude", 31.23453232);
    cJSON_AddNumberToObject(gpsData1 ,"Latitude",  118.45345431;
    cJSON* gpsData2 = NULL;
    gpsData2 = cJSON_CreateObject();
    cJSON_AddNumberToObject(gpsData2 ,"Longitude", 31.23453245);
    cJSON_AddNumberToObject(gpsData2 ,"Latitude",  118.45345443;
    cJSON* gpsData3 = NULL;
    gpsData3 = cJSON_CreateObject();
    cJSON_AddNumberToObject(gpsData3 ,"Longitude", 31.23453255);
    cJSON_AddNumberToObject(gpsData3 ,"Latitude",  118.45345453;

    
	//創(chuàng)建數(shù)組,把gps點添加到gps數(shù)組
	cJSON* gpsArray = NULL;
    gpsArray = cJSON_CreateArray();
    cJSON_AddItemToArray(gpsArray ,gpsData1 );
    cJSON_AddItemToArray(gpsArray ,gpsData2 );
    cJSON_AddItemToArray(gpsArray ,gpsData3 );

	//把gps數(shù)組添加到根節(jié)點
	cJSON_AddItemToObject(root,"gpsData",gpsArray );

4、輸出組裝的JSON

char *msg;
msg =  cJSON_Print(root);

5、依然要記得釋放內(nèi)存文章來源地址http://www.zghlxwxcb.cn/news/detail-425425.html

cJSON_Delete(root);

到了這里,關于【嵌入式開源庫:cJSON】 一個輕量級C語言JSON數(shù)據(jù)解析庫用法詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 帶你了解LVGL:一個開源的嵌入式圖形庫

    帶你了解LVGL:一個開源的嵌入式圖形庫

    嵌入式系統(tǒng)是一種將計算機硬件和軟件集成在一個特定的應用中的系統(tǒng),例如智能手機、智能手表、汽車儀表盤等。嵌入式系統(tǒng)通常需要與用戶進行交互,因此需要一個友好和易用的圖形用戶界面(GUI)。然而,開發(fā)一個高質(zhì)量的GUI并不容易,因為嵌入式系統(tǒng)通常有限的資源

    2024年02月09日
    瀏覽(22)
  • 嵌入式學習:開源與閉源

    開源指的是那些源代碼或源設計可以被大眾使用、修改發(fā)行的軟件或設計體,閉源就是不開放源代碼。 Linux?無疑是開源軟件里最最成功的一個,不管是從它目前的生態(tài)建設角度,還是從業(yè)界評價來看,包括今天云計算的基礎也都倚賴Linux的貢獻和基石。當然,像OpenStack、Ha

    2024年02月08日
    瀏覽(20)
  • Qt優(yōu)秀開源項目之二十一:遇見QSkinny,一個輕量級Qt UI庫

    Qt優(yōu)秀開源項目之二十一:遇見QSkinny,一個輕量級Qt UI庫

    目錄 一.QSkinny簡介 二.工作原理 三.編譯 QSkinny庫基于Qt Graphic View和Qt/Quick中少量的核心類。它提供了一組輕量級控件,可以在C++或QML中使用這些控件。QSkinny默認是啟用硬件加速的,非常適合嵌入式設備,目前已經(jīng)應用于大量汽車GUI的代碼實現(xiàn)中。正如預期的那樣,它有良好的

    2024年01月23日
    瀏覽(23)
  • 嵌入式相關開源項目、庫、資料------持續(xù)更新中

    學習初期最難找的就是找學習資料了,本貼精心匯總了一些嵌入式相關資源,包括但不限于編程語言、單片機、開源項目、物聯(lián)網(wǎng)、操作系統(tǒng)、Linux、計算機等資源,并且在不斷地更新中,致力于打造全網(wǎng)最全的嵌入式資料庫。有好的嵌入式相關資源的朋友歡迎做貢獻,利人

    2024年02月02日
    瀏覽(23)
  • 分享一款嵌入式開源按鍵框架代碼工程MultiButton

    分享一款嵌入式開源按鍵框架代碼工程MultiButton

    MultiButton 是一個小巧簡單易用的事件驅(qū)動型按鍵驅(qū)動模塊。 Github地址:https://github.com/0x1abin/MultiButton 這個項目非常精簡,只有兩個文件: (1)可無限擴展按鍵; (2)按鍵事件的回調(diào)異步處理方式可以簡化程序結(jié)構,去除冗余的按鍵處理硬編碼,讓按鍵業(yè)務邏輯更清晰。 通

    2024年04月15日
    瀏覽(29)
  • 嵌入式Qt 第一個Qt項目

    嵌入式Qt 第一個Qt項目

    打開Qt Creator 界面選擇 New Project或者選擇菜單欄 【文件】-【新建文件或項目】菜單項 ??彈出New Project對話框,選擇Qt Widgets Application 選擇【Choose】按鈕,彈出如下對話框 設置項目名稱和路徑,按照向?qū)нM行下一步? ?選擇編譯套件 向?qū)J添加一個繼承自QMainWindow的類,可

    2024年02月20日
    瀏覽(17)
  • 嵌入式系統(tǒng)(embedded systems)-配置文件解析-開源庫minIni

    嵌入式系統(tǒng)(embedded systems)-配置文件解析-開源庫minIni

    minIni開源庫的介紹 minIni是一個用于在嵌入式系統(tǒng)中讀寫“INI”文件的程序庫。minIni占用很少的資源,具有確定的內(nèi)存占用,并且可以為各種類型的文件I/O庫配置。 gitee 鏈接:link https://gitee.com/resetlove/minIni github 鏈接:link https://github.com/compuphase/minIni.git minlni是一個可移植和可配置

    2024年02月03日
    瀏覽(16)
  • 【嵌入式】使用MultiButton開源庫驅(qū)動按鍵并控制多級界面切換

    【嵌入式】使用MultiButton開源庫驅(qū)動按鍵并控制多級界面切換

    目錄 一 背景說明 二 參考資料 三 MultiButton開源庫移植 四 設計實現(xiàn)--驅(qū)動按鍵 五 設計實現(xiàn)--界面處理 ? ? ? ? 需要做一個 通過不同按鍵控制多級界面切換以及界面動作 的程序。 ????????查閱相關資料,發(fā)現(xiàn)網(wǎng)上大多數(shù)的應用都比較繁瑣,且對于多級界面的切換邏輯可讀

    2024年02月07日
    瀏覽(26)
  • 嵌入式Qt 開發(fā)一個音樂播放器

    嵌入式Qt 開發(fā)一個音樂播放器

    上篇文章:RK3568源碼編譯與交叉編譯環(huán)境搭建,進行了OK3568開發(fā)板軟件開發(fā)環(huán)境搭建,通過編譯RK3568的源碼,可以得到Qt開發(fā)的交叉編譯相關工具。 本篇,就來在搭建好的軟件開發(fā)中,進行Qt軟件的開發(fā)測試。由于Qt是支持跨平臺的,因此本篇的音樂播放器,先在Windows上編寫

    2024年02月02日
    瀏覽(41)
  • 【嵌入式資訊】Arm 通過引入 Keil MDK 版本 6 將嵌入式軟件開發(fā)提升到一個新的水平

    【嵌入式資訊】Arm 通過引入 Keil MDK 版本 6 將嵌入式軟件開發(fā)提升到一個新的水平

    ????????隨著物聯(lián)網(wǎng)設備變得越來越智能,開發(fā)人員面臨著日益增加的軟件復雜性,這需要新的開發(fā)流程來創(chuàng)建優(yōu)化的 ML 模型和高效的設備驅(qū)動程序。因此,我們?yōu)樯鷳B(tài)系統(tǒng)提供的軟件開發(fā)平臺和工具必須與我們的處理器路線圖一起發(fā)展。Keil 微控制器開發(fā)套件?(Keil M

    2024年02月15日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包