這篇文章主要為大家展示了“cJSON庫(kù)有什么用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“cJSON庫(kù)有什么用”這篇文章吧。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),瑪曲企業(yè)網(wǎng)站建設(shè),瑪曲品牌網(wǎng)站建設(shè),網(wǎng)站定制,瑪曲網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,瑪曲網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。cJSON是一個(gè)輕量級(jí)的json解析庫(kù)。使用起來(lái)非常簡(jiǎn)單,整個(gè)庫(kù)非常地簡(jiǎn)潔,核心功能的實(shí)現(xiàn)都在cJSON.c文件,非常適合閱讀源代碼來(lái)學(xué)習(xí)C語(yǔ)言。最近讀完這個(gè)庫(kù)的源碼,分享自己收獲的一些心得。
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。 易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個(gè)子集。 JSON采用完全獨(dú)立于語(yǔ)言的文本格式,但是也使用了類似于C語(yǔ)言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言。
cjson庫(kù)github地址:https://github.com/DaveGamble/cJSON
整個(gè)庫(kù)包含cJSON.h和cJSON.c兩個(gè)文件,頭文件定義了一系列的API。這個(gè)庫(kù)最基本也最重要的功能就是解析一個(gè)json字符串,使用的API是cJSON_Parse。cJSON_Parse函數(shù)調(diào)用了cJSON_ParseWithOpts函數(shù),該函數(shù)實(shí)現(xiàn)了具體的邏輯。
兩個(gè)函數(shù)的原型如下:
CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
函數(shù)接收一段字符串,然后進(jìn)行解析后返回。解析完返回的是一個(gè)cjson結(jié)構(gòu),cJSON結(jié)構(gòu)的定義如下:
typedef struct cJSON { struct cJSON *next; // 向后指針 struct cJSON *prev; // 向前指針 struct cJSON *child; // 指向子元素,比如子數(shù)組或者子對(duì)象 int type; // 元素的類型 char *valuestring; // 元素的字符串值,如果type == cJSON_String 或者 type == cJSO_Raw int valueint; // 已廢棄,現(xiàn)在使用cJSON_SetNumberValue設(shè)置整型值 double valuedouble; // 元素的整型值,如果type == cJSON_Number char *string; // 表示元素鍵值的值,如果它有子元素的話} cJSON;
json的官網(wǎng)在這里,http://www.json.org
網(wǎng)站首頁(yè)描述了json是什么以及它的格式規(guī)范,有了規(guī)范之后,可以知道json是如何構(gòu)成的,因此就有了如何解析json數(shù)據(jù)的方向。
json使用兩種結(jié)構(gòu)構(gòu)建,對(duì)象或者數(shù)組。
對(duì)象使用{
作開(kāi)頭,}
作結(jié)尾,里邊的每一個(gè)元素都是鍵值對(duì)的無(wú)序集合,鍵名和值使用:
分隔,使用,
分隔每一個(gè)元素;數(shù)組使用[作開(kāi)頭,]作結(jié)尾,里面的元素都是有序的值組成的集合,且使用,
做分隔符。
每一個(gè)值可以是字符串,整型,也可以是true,false,null等常量,還可以是對(duì)象或數(shù)組,因?yàn)閖son結(jié)構(gòu)是可嵌套的。
因此,我們可以得知:
1、可以根據(jù)json的首字母判斷整個(gè)json的類型,如果json以'{'
開(kāi)頭時(shí),就是對(duì)象,以'['
開(kāi)頭時(shí),就是數(shù)組,否則就是字符串或者其他常量。
2、如果是對(duì)象,那么它的一定有鍵名,先解析它的鍵名,然后解析它的值,解析值的過(guò)程與第一步一樣,遞歸解析
3、如果是數(shù)組,則逐個(gè)解析數(shù)組內(nèi)的元素,直到遇到]
為止,解析數(shù)組里面的元素的過(guò)程也是與第一步一致,遞歸解析。
這就是根據(jù)json官網(wǎng)的定義得出解析json字符串的思路,接下來(lái)看看cJSON庫(kù)是如何實(shí)現(xiàn)的。cJSON_Parse的實(shí)現(xiàn)流程圖如下:
cJSON_ParseWithOpts函數(shù)里面調(diào)用了parse_value,是整個(gè)函數(shù)的核心實(shí)現(xiàn)。
parse_value函數(shù)的流程圖如下所示:
可以看到,parse_value是對(duì)json值的開(kāi)頭進(jìn)行判斷,然后進(jìn)入相應(yīng)的分支進(jìn)行解析,下面對(duì)每一個(gè)分支進(jìn)行分析。解析出來(lái)的值是保存在cJSON的結(jié)構(gòu)體中,以下命名為item。
如果json值是以'null','true','false',則分別將item的type設(shè)置為cJSON_NULL、cJSON_TRUE、cJSON_FALSE。然后繼續(xù)解析剩下的json值。
如果遇到"開(kāi)頭,則說(shuō)明json值是字符串,就解析它的值,此時(shí)只需要拿到兩個(gè)"之間的值即可。保存字符串也是一個(gè)結(jié)構(gòu)體,需要申請(qǐng)內(nèi)存,計(jì)算長(zhǎng)度的過(guò)程中,當(dāng)遇到轉(zhuǎn)義字符時(shí),需要記錄,因?yàn)檗D(zhuǎn)義符不保存。
當(dāng)遇到數(shù)字開(kāi)頭時(shí),將其后面的數(shù)字字符記錄起來(lái),然后轉(zhuǎn)成整型數(shù)字,然后做值的范圍檢查。
解析數(shù)組時(shí),為數(shù)組的元素創(chuàng)建一個(gè)新的json結(jié)構(gòu)體new_item,然后繼續(xù)解析數(shù)組里面的值,用','判斷下一個(gè)元素的位置,得到的值保存到結(jié)構(gòu)體中,并將多個(gè)元素用鏈表連接起來(lái)。一直解析,直到遇到']'符號(hào)。
解析對(duì)象的過(guò)程與數(shù)組的類似,為對(duì)象的元素創(chuàng)建一個(gè)新的json結(jié)構(gòu)體new_item,然后繼續(xù)解析對(duì)象里面的值,對(duì)象是有鍵值對(duì)組成的,因此先得到鍵的值,然后用':'判斷值的位置,進(jìn)而繼續(xù)解析得到值,多個(gè)鍵值對(duì)之間用','分隔開(kāi),最后用鏈表連接起來(lái)。一直解析,直到遇到'}'符號(hào)。
在解析所有值之前,會(huì)調(diào)用skip_whitespace函數(shù)過(guò)濾字符串兩邊的所有空白字符。此處是ASCII碼小于等于32的字符,如:\t、\n。函數(shù)如下:
static const unsigned char *skip_whitespace(const unsigned char *in) { while (in && *in && (*in <= 32)) { in++; } return in; }
以上是“cJSON庫(kù)有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前標(biāo)題:cJSON庫(kù)有什么用-創(chuàng)新互聯(lián)
文章源于:http://www.rwnh.cn/article0/cegeoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、標(biāo)簽優(yōu)化、品牌網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、定制網(wǎng)站、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容