溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

cJSON庫(kù)有什么用

發(fā)布時(shí)間:2021-11-24 11:00:55 來(lái)源:億速云 閱讀:181 作者:小新 欄目:網(wǎng)絡(luò)安全

這篇文章主要為大家展示了“cJSON庫(kù)有什么用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“cJSON庫(kù)有什么用”這篇文章吧。

cJSON庫(kù)是什么?

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,照搬json官網(wǎng)的說(shuō)法:

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ù)里面有什么?

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;

如何解析一個(gè)json字符串?

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庫(kù)有什么用

cJSON_ParseWithOpts函數(shù)里面調(diào)用了parse_value,是整個(gè)函數(shù)的核心實(shí)現(xiàn)。
parse_value函數(shù)的流程圖如下所示:
cJSON庫(kù)有什么用

可以看到,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值。

string

如果遇到"開(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)義符不保存。

number

當(dāng)遇到數(shù)字開(kāi)頭時(shí),將其后面的數(shù)字字符記錄起來(lái),然后轉(zhuǎn)成整型數(shù)字,然后做值的范圍檢查。

array

解析數(shù)組時(shí),為數(shù)組的元素創(chuàng)建一個(gè)新的json結(jié)構(gòu)體new_item,然后繼續(xù)解析數(shù)組里面的值,用','判斷下一個(gè)元素的位置,得到的值保存到結(jié)構(gòu)體中,并將多個(gè)元素用鏈表連接起來(lái)。一直解析,直到遇到']'符號(hào)。

object

解析對(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)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI