日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

DSP学习 -- cJSON使用教程

發(fā)布時間:2025/3/15 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DSP学习 -- cJSON使用教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如需轉(zhuǎn)載請注明出處 https://juyou.blog.csdn.net/article/details/107870229

JSON 需要簡單的了解一下。誰知道啥時候用上呢~

一、JSON簡介

參看:JSON簡介
參看:cJSON使用詳細教程 | 一個輕量級C語言JSON解析器

參看:千萬不要點開,Cjson入門快速使用看這篇就夠了(CJSON入門操作以及問題講解,CJSON對象刪除出錯)

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。 易于人閱讀和編寫。同時也易于機器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數(shù)據(jù)交換語言。

JSON建構(gòu)于兩種結(jié)構(gòu):

“名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),紀錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯(lián)數(shù)組 (associative array)。
值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數(shù)組(array)。
這些都是常見的數(shù)據(jù)結(jié)構(gòu)。事實上大部分現(xiàn)代計算機語言都以某種形式支持它們。這使得一種數(shù)據(jù)格式在同樣基于這些結(jié)構(gòu)的編程語言之間交換成為可能。

JSON具有以下這些形式:

對象是一個無序的“‘名稱/值’對”集合。一個對象以 {左括號 開始, }右括號 結(jié)束。每個“名稱”后跟一個 :冒號 ;“‘名稱/值’ 對”之間使用 ,逗號 分隔。

數(shù)組是值(value)的有序集合。一個數(shù)組以 [左中括號 開始, ]右中括號 結(jié)束。值之間使用 ,逗號 分隔。

值(value)可以是雙引號括起來的字符串(string)、數(shù)值(number)、true、false、 null、對象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套。

字符串(string)是由雙引號包圍的任意數(shù)量Unicode字符的集合,使用反斜線轉(zhuǎn)義。一個字符(character)即一個單獨的字符串(character string)。

字符串(string)與C或者Java的字符串非常相似。

數(shù)值(number)也與C或者Java的數(shù)值非常相似。除去未曾使用的八進制與十六進制格式。除去一些編碼細節(jié)。

空白可以加入到任何符號之間。 以下描述了完整的語言。

二、數(shù)據(jù)結(jié)構(gòu)

cJSON使用cJSONstruct數(shù)據(jù)類型表示JSON數(shù)據(jù):

/ * cJSON結(jié)構(gòu):* /typedef 結(jié)構(gòu) cJSON {struct cJSON *下一步;struct cJSON *上一頁;struct cJSON * child;INT類型;char * valuestring;/ *不建議寫入valueint,請改用cJSON_SetNumberValue * /int valueint;double valuedouble;字符 * string; } cJSON;

此類型的項目表示JSON值。類型存儲type為位標記(這意味著您不能僅通過比較的值來找到類型type)。

要檢查項目的類型,請使用相應的cJSON_Is…功能。它會先執(zhí)行NULL檢查,然后進行類型檢查,如果該項屬于此類型,則返回布爾值。

類型可以是以下之一:

  • cJSON_Invalid(選中cJSON_IsInvalid):表示一個不包含任何值的無效項目。如果將項目設置為全零字節(jié),則將自動具有此類型。

  • cJSON_False(選中cJSON_IsFalse):表示false布爾值。您也可以使用來檢查布爾值cJSON_IsBool。

  • cJSON_True(選中cJSON_IsTrue):表示true布爾值。您也可以使用來檢查布爾值cJSON_IsBool。

  • cJSON_NULL(選中cJSON_IsNull):表示一個null值。

  • cJSON_Number(用選中cJSON_IsNumber):表示一個數(shù)字值。該值存儲為double in valuedouble和in valueint。如果數(shù)字超出整數(shù)范圍,INT_MAX或INT_MIN用于valueint。

  • cJSON_String(用選中cJSON_IsString):表示一個字符串值。它以零終止字符串的形式存儲在中valuestring。

  • cJSON_Array(用選中cJSON_IsArray):表示一個數(shù)組值。這是通過指向表示數(shù)組中值child的cJSON項目的鏈接列表來實現(xiàn)的。使用next和將元素鏈接在一起prev,其中第一個元素具有prev.next == NULL和最后一個元素next == NULL。

  • cJSON_Object(用選中cJSON_IsObject):表示一個對象值。對象的存儲方式與數(shù)組相同,唯一的區(qū)別是對象中的項將其鍵存儲在中string。

  • cJSON_Raw(選中cJSON_IsRaw):表示以JSON字符存儲的零終止形式的任何JSON valuestring。例如,可以使用它來避免一遍又一遍地打印相同的靜態(tài)JSON以節(jié)省性能。解析時,cJSON永遠不會創(chuàng)建此類型。另請注意,cJSON不會檢查其是否為有效JSON。
    此外,還有以下兩個標志:

  • cJSON_IsReference:指定child指向和/或valuestring不屬于該項目的項目,它僅是參考。因此,cJSON_Deleteand其他函數(shù)只會取消分配該項目,而不會取消分配child/ valuestring。

  • cJSON_StringIsConst:這意味著string指向一個常量字符串。這意味著cJSON_Delete和其他函數(shù)將不會嘗試解除分配string。

三、處理數(shù)據(jù)結(jié)構(gòu)

對于每種值類型,都有一個cJSON_Create…函數(shù)可用于創(chuàng)建該類型的項目。所有這些都將分配一個cJSON結(jié)構(gòu),以后可以使用刪除該結(jié)構(gòu)cJSON_Delete。請注意,您必須在某些時候?qū)⑵鋭h除,否則會發(fā)生內(nèi)存泄漏。
重要提示:如果您已經(jīng)將項目添加到數(shù)組或?qū)ο笾?#xff0c;則不能使用刪除它cJSON_Delete。將其添加到數(shù)組或?qū)ο髮⑥D(zhuǎn)移其所有權,以便在刪除該數(shù)組或?qū)ο髸r也將其刪除。您還可以使用cJSON_SetValuestring來更改cJSON_String的valuestring,而無需valuestring手動釋放前一個。

基本類型

  • 用創(chuàng)建空值cJSON_CreateNull
  • 布爾與創(chuàng)建cJSON_CreateTrue,cJSON_CreateFalse或cJSON_CreateBool
  • 用創(chuàng)建數(shù)字cJSON_CreateNumber。這將同時設置valuedouble和valueint。如果數(shù)字超出整數(shù)范圍,INT_MAX或者INT_MIN用于valueint
  • 字符串是使用cJSON_CreateString(復制字符串)或使用cJSON_CreateStringReference(直接指向字符串。)創(chuàng)建的,valuestring因此不會被刪除,cJSON_Delete并且您將對其生命負責,這對常量很有用。

數(shù)組

您可以使用創(chuàng)建空數(shù)組cJSON_CreateArray。cJSON_CreateArrayReference可以用于創(chuàng)建不“擁有”其內(nèi)容的數(shù)組,因此不會被刪除其內(nèi)容cJSON_Delete。

要將項目添加到數(shù)組,請使用cJSON_AddItemToArray將項目追加到末尾。cJSON_AddItemReferenceToArray可以將使用元素添加為對另一個項目,數(shù)組或字符串的引用。這意味著cJSON_Delete不會刪除該項目child或valuestring屬性,因此,如果已經(jīng)在其他地方使用過,則不會發(fā)生雙重釋放。要在中間插入項目,請使用cJSON_InsertItemInArray。它將在基于0的給定索引處插入一個項目,并將所有現(xiàn)有項目向右移動。

如果要從給定索引的數(shù)組中取出項目并繼續(xù)使用,請使用cJSON_DetachItemFromArray,它將返回分離的項目,因此請確保將其分配給指針,否則會發(fā)生內(nèi)存泄漏。

用刪除項目cJSON_DeleteItemFromArray。它的工作方式類似于cJSON_DetachItemFromArray,但通過刪除了分離的項目cJSON_Delete。

您也可以替換數(shù)組中的項目。要么cJSON_ReplaceItemInArray使用索引或與cJSON_ReplaceItemViaPointer給定的一個指針的元素。如果失敗cJSON_ReplaceItemViaPointer將返回0。這在內(nèi)部所做的是分離舊項目,將其刪除,然后將新項目插入其位置。

要獲取數(shù)組的大小,請使用cJSON_GetArraySize。使用cJSON_GetArrayItem給定的索引處得到的元素。

由于數(shù)組存儲為鏈接列表,因此通過索引對其進行迭代效率不高(O(n2)),因此您可以使用cJSON_ArrayForEach宏在O(n)時間復雜度上對數(shù)組進行迭代。

對象

您可以使用創(chuàng)建一個空對象cJSON_CreateObject。cJSON_CreateObjectReference可用于創(chuàng)建不“擁有”其內(nèi)容的對象,因此不會通過刪除其內(nèi)容cJSON_Delete。

要將項目添加到對象,請使用cJSON_AddItemToObject。使用cJSON_AddItemToObjectCS將項目添加到一個物體是一個常量或引用(該項目的密鑰,名稱string中的cJSON結(jié)構(gòu)),以便它不會被釋放cJSON_Delete。cJSON_AddItemReferenceToArray可以將使用元素添加為對另一個對象,數(shù)組或字符串的引用。這意味著cJSON_Delete不會刪除該項目child或valuestring屬性,因此,如果已經(jīng)在其他地方使用過,則不會發(fā)生雙重釋放。

如果要從對象中取出一個項目,請使用cJSON_DetachItemFromObjectCaseSensitive,它將返回分離的項目,因此請確保將其分配給指針,否則會發(fā)生內(nèi)存泄漏。

用刪除項目cJSON_DeleteItemFromObjectCaseSensitive。它的工作原理是cJSON_DetachItemFromObjectCaseSensitive其次cJSON_Delete。

您還可以替換對象中的項目。要么用cJSON_ReplaceItemInObjectCaseSensitive使用密鑰或與cJSON_ReplaceItemViaPointer給定的一個指針的元素。如果失敗cJSON_ReplaceItemViaPointer將返回0。這在內(nèi)部所做的是分離舊項目,將其刪除,然后將新項目插入其位置。

要獲取對象的大小,可以使用cJSON_GetArraySize,因為內(nèi)部對象存儲為數(shù)組,所以可以使用。

如果要訪問對象中的項目,請使用cJSON_GetObjectItemCaseSensitive。

要遍歷對象,可以使用與cJSON_ArrayForEach數(shù)組相同的方式使用宏。

cJSON還提供了便捷的幫助器功能,用于快速創(chuàng)建新項目并將其添加到對象中,例如cJSON_AddNullToObject。他們返回一個指向新項目的指針,或者NULL如果它們失敗了。

四、解析JSON

在以零結(jié)尾的字符串中提供一些JSON的情況下,您可以使用進行解析cJSON_Parse。

cJSON * json = cJSON_Parse(string);

給定字符串中的JSON(無論是否以零終止),您可以使用解析cJSON_ParseWithLength。

cJSON * json = cJSON_ParseWithLength(string,buffer_length);

它將解析JSON并分配cJSON代表它的項目樹。返回后,您將完全負責將其與一起使用后進行分配cJSON_Delete。

cJSON_Parseis malloc和free默認情況下使用的分配器,但是可以使用進行更改(全局)cJSON_InitHooks。

如果發(fā)生錯誤,則可以使用來訪問輸入字符串中錯誤位置的指針cJSON_GetErrorPtr。不過,請注意這可能會產(chǎn)生競態(tài)條件在多線程的情況,在這種情況下,最好是使用cJSON_ParseWithOpts帶有return_parse_end。默認情況下,輸入字符串中已解析的JSON后面的字符將不被視為錯誤。

如果需要更多選項,請使用cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)。 return_parse_end返回指向輸入字符串中JSON末尾或錯誤發(fā)生位置的指針(從而以cJSON_GetErrorPtr線程安全的方式進行替換)。require_null_terminated,如果設置為,則1如果輸入字符串包含JSON之后的數(shù)據(jù),則會導致錯誤。

如果需要更多選項來指定緩沖區(qū)長度,請使用cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated)。

五、打印JSON

給定一個cJSON項目樹,您可以使用將它們打印為字符串cJSON_Print。

char * string = cJSON_Print(json);
它將分配一個字符串并在其中打印樹的JSON表示形式。一旦返回,您將完全負責與分配器一起使用后對其進行分配。(通常free,取決于設置的內(nèi)容cJSON_InitHooks)。

cJSON_Print將使用空格打印以進行格式化。如果要打印而不格式化,請使用cJSON_PrintUnformatted。

如果您對結(jié)果字符串的大小有大致了解,可以使用cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt)。fmt是一個布爾值,用于打開和關閉帶有空格的格式化。prebuffer指定用于打印的第一個緩沖區(qū)大小。cJSON_Print當前使用的第一個緩沖區(qū)大小為256個字節(jié)。一旦打印空間不足,將分配一個新的緩沖區(qū),并在繼續(xù)打印之前復制舊的緩沖區(qū)。

使用可以完全避免這些動態(tài)緩沖區(qū)分配cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format)。它需要一個緩沖區(qū)來指向要打印的指針及其長度。如果達到該長度,則打印將失敗并返回0。如果成功,1則返回。請注意,您應該提供比實際需要更多的5個字節(jié),因為cJSON在估計提供的內(nèi)存是否足夠時不是100%準確的。

六、示例

在此示例中,我們要構(gòu)建并解析以下JSON:

{“ name ”:“ Awesome 4K ”,“ resolutions ”:[{“寬度”: 1280,“高度”: 720},{“寬度”: 1920,“高度”: 1080},{“寬度”: 3840,“高度”: 2160}] }

列印
讓我們構(gòu)建上面的JSON并將其打印為字符串:

//創(chuàng)建具有支持的分辨率列表的監(jiān)視器 // //注意:返回分配給堆的字符串,使用后需要釋放它。 char * create_monitor( void) {const unsigned int resolution_numbers [ 3 ] [ 2 ] = {{ 1280,720 },{ 1920,1080 },{ 3840,2160 }};char * string = NULL ;cJSON *名稱= NULL ;cJSON * resolutions = NULL ;cJSON * resolution = NULL ;cJSON * width = NULL ;cJSON * height = NULL ;size_t 索引 = 0 ;cJSON * monitor = cJSON_CreateObject();如果(監(jiān)控== NULL){轉(zhuǎn)到結(jié)尾}name = cJSON_CreateString(“ Awesome 4K ”);如果(name == NULL){轉(zhuǎn)到結(jié)尾}/ *創(chuàng)建成功后,立即將其添加到監(jiān)視器中,從而將指針的所有權轉(zhuǎn)移給它* /cJSON_AddItemToObject(監(jiān)視器, “ name ”,名稱);分辨率= cJSON_CreateArray();如果(分辨率== NULL){轉(zhuǎn)到結(jié)尾}cJSON_AddItemToObject(監(jiān)視器,“ resolutions ”,決議);對于(index = 0 ; index <(sizeof(resolution_numbers)/(2 * sizeof(int))); ++ index){分辨率= cJSON_CreateObject();如果(解析度== NULL){轉(zhuǎn)到結(jié)尾}cJSON_AddItemToArray(分辨率,分辨率);width = cJSON_CreateNumber(resolution_numbers [ index ] [ 0 ]);如果(寬度== NULL){轉(zhuǎn)到結(jié)尾}cJSON_AddItemToObject(resolution,“ width ”,width);高度= cJSON_CreateNumber(resolution_numbers [ index ] [ 1 ]);如果(高度== NULL){轉(zhuǎn)到結(jié)尾}cJSON_AddItemToObject(resolution,“ height ”,height);}字符串= cJSON_Print(監(jiān)視器);如果(string == NULL){fprintf(stderr,“無法打印監(jiān)視器。\ n ”);}結(jié)束:cJSON_Delete(監(jiān)視器);返回字符串; }

另外,我們可以使用cJSON_Add…ToObject輔助函數(shù)使我們的生活更輕松一些:

//注意:返回堆分配的字符串,使用后需要釋放它。 char * create_monitor_with_helpers( void) {const unsigned int resolution_numbers [ 3 ] [ 2 ] = {{ 1280,720 },{ 1920,1080 },{ 3840,2160 }};char * string = NULL ;cJSON * resolutions = NULL ;size_t 索引 = 0 ;cJSON * monitor = cJSON_CreateObject();if(cJSON_AddStringToObject(監(jiān)視器,“ name ”,“ Awesome 4K ”)== NULL){轉(zhuǎn)到結(jié)尾}分辨率= cJSON_AddArrayToObject(監(jiān)視器,“分辨率”);如果(分辨率== NULL){轉(zhuǎn)到結(jié)尾}對于(index = 0 ; index <(sizeof(resolution_numbers)/(2 * sizeof(int))); ++ index){cJSON * resolution = cJSON_CreateObject();if(cJSON_AddNumberToObject(resolution,“ width ”,resolution_numbers [ index ] [ 0 ])== NULL){轉(zhuǎn)到結(jié)尾}if(cJSON_AddNumberToObject(resolution,“ height ”,resolution_numbers [ index ] [ 1 ])== NULL){轉(zhuǎn)到結(jié)尾}cJSON_AddItemToArray(分辨率,分辨率);}字符串= cJSON_Print(監(jiān)視器);如果(string == NULL){fprintf(stderr,“無法打印監(jiān)視器。\ n ”);}結(jié)束:cJSON_Delete(監(jiān)視器);返回字符串; }

解析中
在此示例中,我們將解析上述格式的JSON,并在打印某些診斷輸出時檢查監(jiān)視器是否支持Full HD分辨率:

/ *如果監(jiān)視器支持全高清,則返回1,否則返回0 * /int support_full_hd( const char * const monitor) {const cJSON * resolution = NULL ;const cJSON * resolutions = NULL ;const cJSON * name = NULL ;int狀態(tài)= 0 ;cJSON * monitor_json = cJSON_Parse(監(jiān)視器);如果(monitor_json == NULL){const char * error_ptr = cJSON_GetErrorPtr();如果(error_ptr!= NULL){fprintf(stderr,“之前的錯誤:%s \ n ”,error_ptr);}狀態(tài)= 0 ;轉(zhuǎn)到結(jié)尾}名稱= cJSON_GetObjectItemCaseSensitive(monitor_json,“名稱”);如果(cJSON_IsString(name)&&(name-> valuestring!= NULL)){printf(“正在檢查監(jiān)視器\” %s \“ \ n ”,name-> valuestring);}分辨率= cJSON_GetObjectItemCaseSensitive(monitor_json,“分辨率”);cJSON_ArrayForEach(分辨率,分辨率){cJSON * width = cJSON_GetObjectItemCaseSensitive(分辨率,“ width ”);cJSON * height = cJSON_GetObjectItemCaseSensitive(分辨率,“ height ”);if(!cJSON_IsNumber(寬度)||!cJSON_IsNumber(高度)){狀態(tài)= 0 ;轉(zhuǎn)到結(jié)尾}如果((width- > valuedouble == 1920)&&(height- > valuedouble == 1080)){狀態(tài)= 1 ;轉(zhuǎn)到結(jié)尾}}結(jié)束:cJSON_Delete(monitor_json);返回狀態(tài); }

請注意,除了Result以外沒有NULL檢查,cJSON_Parse因為因為已經(jīng)cJSON_GetObjectItemCaseSensitive檢查了NULL輸入,因此NULL僅傳播一個值cJSON_IsNumber,如果輸入為,則cJSON_IsString返回0 NULL

七、注意事項

零字符

cJSON不支持包含零字符’\0’或的字符串\u0000。對于當前的API,這是不可能的,因為字符串以零結(jié)尾。

字符編碼

cJSON僅支持UTF-8編碼的輸入。但是在大多數(shù)情況下,它不會拒絕無效的UTF-8作為輸入,而只是將其原樣傳播。只要輸入不包含無效的UTF-8,輸出將始終是有效的UTF-8。

C標準

cJSON用ANSI C(或C89,C90)編寫。如果您的編譯器或C庫未遵循此標準,則不能保證正確的行為。

注意:ANSI C不是C ++,因此不應使用C ++編譯器進行編譯。您可以使用C編譯器進行編譯,然后將其與C ++代碼鏈接。盡管可以使用C ++編譯器進行編譯,但不能保證正確的行為。

浮點數(shù)字

double除IEEE754雙精度浮點數(shù)外,cJSON不正式支持任何實現(xiàn)。它可能仍然可以與其他實現(xiàn)一起使用,但是這些實現(xiàn)的錯誤將被視為無效。

目前,cJSON支持的浮點文字的最大長度為63個字符。

數(shù)組和對象的深層嵌套

cJSON不支持嵌套太深的數(shù)組和對象,因為這會導致堆棧溢出。為了防止這種CJSON_NESTING_LIMIT情況,默認情況下,cJSON將深度限制為1000,但可以在編譯時進行更改。

線程安全

通常,cJSON 不是線程安全的。

但是,在以下情況下它是線程安全的:

  • cJSON_GetErrorPtr永遠不會使用(可以改用return_parse_end參數(shù)cJSON_ParseWithOpts)
  • cJSON_InitHooks 僅在任何線程中使用cJSON之前才被調(diào)用。
  • setlocale 在返回對cJSON函數(shù)的所有調(diào)用之前,永遠不會調(diào)用它。

區(qū)分大小寫

最初創(chuàng)建cJSON時,它不遵循JSON標準,并且沒有區(qū)分大寫和小寫字母。如果您想要正確的,符合標準的行為,則需要使用CaseSensitive可用的功能。

復制對象成員

cJSON支持解析和打印JSON,該JSON包含具有多個具有相同名稱的成員的對象。cJSON_GetObjectItemCaseSensitive但是始終只會返回第一個。

二、下載使用

下載地址: https://github.com/DaveGamble/cJSON

因為整個庫只有一個C文件和一個頭文件,所以您只需復制cJSON.h并復制cJSON.c到項目源并開始使用它。

示例下載:https://github.com/whik/cJSON_Demo

/*Copyright (c) 2009 Dave GamblePermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS INTHE SOFTWARE. */#include <stdio.h> #include <stdlib.h> #include "cJSON.h"/* Parse text to JSON, then render back to text, and print! */ void doit(char *text) {char *out;cJSON *json;json=cJSON_Parse(text);if (!json) {printf("Error before: [%s]\n",cJSON_GetErrorPtr());}else{out=cJSON_Print(json);cJSON_Delete(json);printf("%s\n",out);free(out);} }/* Read a file, parse, render back, etc. */ void dofile(char *filename) {FILE *f;long len;char *data;f=fopen(filename,"rb");fseek(f,0,SEEK_END);len=ftell(f);fseek(f,0,SEEK_SET);data=(char*)malloc(len+1);fread(data,1,len,f);fclose(f);doit(data);free(data); }/* Used by some code below as an example datatype. */ struct record {const char *precision;double lat,lon;const char *address,*city,*state,*zip,*country; };/* Create a bunch of objects as demonstration. */ void create_objects() {cJSON *root,*fmt,*img,*thm,*fld;char *out;int i; /* declare a few. *//* Our "days of the week" array: */const char *strings[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};/* Our matrix: */int numbers[3][3]={{0,-1,0},{1,0,0},{0,0,1}};/* Our "gallery" item: */int ids[4]={116,943,234,38793};/* Our array of "records": */struct record fields[2]={{"zip",37.7668,-1.223959e+2,"","SAN FRANCISCO","CA","94107","US"},{"zip",37.371991,-1.22026e+2,"","SUNNYVALE","CA","94085","US"}};/* Here we construct some JSON standards, from the JSON site. *//* Our "Video" datatype: */root=cJSON_CreateObject(); cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject());cJSON_AddStringToObject(fmt,"type", "rect");cJSON_AddNumberToObject(fmt,"width", 1920);cJSON_AddNumberToObject(fmt,"height", 1080);cJSON_AddFalseToObject (fmt,"interlace");cJSON_AddNumberToObject(fmt,"frame rate", 24);out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out); /* Print to text, Delete the cJSON, print it, release the string. *//* Our "days of the week" array: */root=cJSON_CreateStringArray(strings,7);out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);/* Our matrix: */root=cJSON_CreateArray();for (i=0;i<3;i++) cJSON_AddItemToArray(root,cJSON_CreateIntArray(numbers[i],3));/* cJSON_ReplaceItemInArray(root,1,cJSON_CreateString("Replacement")); */out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);/* Our "gallery" item: */root=cJSON_CreateObject();cJSON_AddItemToObject(root, "Image", img=cJSON_CreateObject());cJSON_AddNumberToObject(img,"Width",800);cJSON_AddNumberToObject(img,"Height",600);cJSON_AddStringToObject(img,"Title","View from 15th Floor");cJSON_AddItemToObject(img, "Thumbnail", thm=cJSON_CreateObject());cJSON_AddStringToObject(thm, "Url", "http:/*www.example.com/image/481989943");cJSON_AddNumberToObject(thm,"Height",125);cJSON_AddStringToObject(thm,"Width","100");cJSON_AddItemToObject(img,"IDs", cJSON_CreateIntArray(ids,4));out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);/* Our array of "records": */root=cJSON_CreateArray();for (i=0;i<2;i++){cJSON_AddItemToArray(root,fld=cJSON_CreateObject());cJSON_AddStringToObject(fld, "precision", fields[i].precision);cJSON_AddNumberToObject(fld, "Latitude", fields[i].lat);cJSON_AddNumberToObject(fld, "Longitude", fields[i].lon);cJSON_AddStringToObject(fld, "Address", fields[i].address);cJSON_AddStringToObject(fld, "City", fields[i].city);cJSON_AddStringToObject(fld, "State", fields[i].state);cJSON_AddStringToObject(fld, "Zip", fields[i].zip);cJSON_AddStringToObject(fld, "Country", fields[i].country);}/* cJSON_ReplaceItemInObject(cJSON_GetArrayItem(root,1),"City",cJSON_CreateIntArray(ids,4)); */out=cJSON_Print(root); cJSON_Delete(root); printf("%s\n",out); free(out);}int main (int argc, const char * argv[]) {/* a bunch of json: */char text1[]="{\n\"name\": \"Jack (\\\"Bee\\\") Nimble\", \n\"format\": {\"type\": \"rect\", \n\"width\": 1920, \n\"height\": 1080, \n\"interlace\": false,\"frame rate\": 24\n}\n}"; char text2[]="[\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"]";char text3[]="[\n [0, -1, 0],\n [1, 0, 0],\n [0, 0, 1]\n ]\n";char text4[]="{\n \"Image\": {\n \"Width\": 800,\n \"Height\": 600,\n \"Title\": \"View from 15th Floor\",\n \"Thumbnail\": {\n \"Url\": \"http:/*www.example.com/image/481989943\",\n \"Height\": 125,\n \"Width\": \"100\"\n },\n \"IDs\": [116, 943, 234, 38793]\n }\n }";char text5[]="[\n {\n \"precision\": \"zip\",\n \"Latitude\": 37.7668,\n \"Longitude\": -122.3959,\n \"Address\": \"\",\n \"City\": \"SAN FRANCISCO\",\n \"State\": \"CA\",\n \"Zip\": \"94107\",\n \"Country\": \"US\"\n },\n {\n \"precision\": \"zip\",\n \"Latitude\": 37.371991,\n \"Longitude\": -122.026020,\n \"Address\": \"\",\n \"City\": \"SUNNYVALE\",\n \"State\": \"CA\",\n \"Zip\": \"94085\",\n \"Country\": \"US\"\n }\n ]";/* Process each json textblock by parsing, then rebuilding: */doit(text1);doit(text2); doit(text3);doit(text4);doit(text5);/* Parse standard testfiles: */ /* dofile("../../tests/test1"); */ /* dofile("../../tests/test2"); */ /* dofile("../../tests/test3"); */ /* dofile("../../tests/test4"); */ /* dofile("../../tests/test5"); *//* Now some samplecode for building objects concisely: */create_objects();return 0; }

如需轉(zhuǎn)載請注明出處 https://juyou.blog.csdn.net/article/details/107870229

總結(jié)

以上是生活随笔為你收集整理的DSP学习 -- cJSON使用教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一级片在线观看 | 成人一区二区三区在线观看 | 久久久婷婷 | 在线va视频 | 国产黄片毛片 | 国产伦精品一区二区三区妓女 | 亚洲天堂资源网 | 一吻定情2013日剧 | 国产精品成人一区 | 亚洲无人区码一码二码三码的含义 | 日韩专区第一页 | 日韩一区二区三区电影 | 国产乱国产乱老熟 | 麻豆精品免费观看 | 啪啪自拍 | 91免费在线播放 | 久久αv| 特级特黄aaaa免费看 | 久久黄色小视频 | www.亚洲欧美 | 用舌头去添高潮无码视频 | 国产片一区二区三区 | 一级久久久久 | 亚洲精品911 | 香蕉中文网 | 国产1区2区3区 | 热热热热色| 人人妻人人澡人人爽人人dvd | 成人欧美一区二区三区黑人一 | 免费在线观看av的网站 | 日韩一二三四区 | 可以看的av网址 | 少妇高潮av久久久久久 | 天堂网久久 | 亚洲天堂第一页 | 久色精品视频 | 91香草视频 | 噜噜啪啪| 欧美裸体xxxx极品少妇 | 大桥未久视频在线观看 | 蜜桃成熟时李丽珍在线观看 | 久久国产麻豆 | 999在线视频 | 午夜小视频在线观看 | 国产免费av片在线观看 | 噜噜噜亚洲色成人网站 | av一级二级 | 久久天堂av | 成人性色生活片 | 特级一级片 | 九九在线观看高清免费 | 亚洲蜜桃av一区二区 | 成人一区二区三区四区 | 99久草 | 无码一区二区三区在线 | 国产欧美一区二区三区国产幕精品 | 五月婷婷综合色 | 人妻丰满熟妇av无码区免 | 五月天久久久久久 | 蜜桃导航-精品导航 | 人人综合网 | 国产精品亚洲二区 | 在线观看亚洲专区 | 日本激情网 | 美日韩中文字幕 | 精久久 | 操欧美女 | 免费污片网站 | 黄色片在线免费观看视频 | 黄色一区二区视频 | 丰满人妻av一区二区三区 | 狠狠夜| 福利精品视频 | 色综合久久五月 | 国产精品夫妻自拍 | 99re这里只有精品在线观看 | 丁香花电影在线观看免费高清 | 亚洲精品美女久久久 | 青青草原国产在线观看 | 国产av无码专区亚洲av毛片搜 | 911亚洲精选 | 吻胸摸激情床激烈视频 | 男女做激情爱呻吟口述全过程 | 亚洲欧美日韩图片 | 日韩精品自拍 | 四虎av在线| 免费在线亚洲 | 青娱乐极品在线 | 五月天开心网 | 91麻豆蜜桃 | 亚洲精品xxx | 琪琪电影午夜理论片八戒八戒 | 欧美一区二区二区 | a级黄色网址| 黄色网入口 | 蜜臀久久精品久久久用户群体 | 国产97在线 | 亚洲 | 日韩高清国产一区在线 | 香蕉久久一区二区三区 |