CentOS 7 使用cJSON 庫

什么是JSON

JSON是一種輕量級的數據交換格式,可讀性強、編寫簡單。鍵值對組合編寫規則,鍵名使用雙引號包裹,冒號:分隔符后面緊跟著數值,有兩種常用的數據類型是對象和數組。

對象:使用花括號{}包裹起來的內容,數據結構{“key1”: “value1”, “key2”:“value2” …},key為對象的屬性,value為對象的值。

數值:使用中括號[]包裹起來的內容,數據結構{“key”: [“value1”, “value2”, “value3” …]}。
?

CentOS 7 安裝cJSON 庫

cJSON Github 地址:https://github.com/DaveGamble/cJSON

步驟1:首先,你需要下載cJSON的源代碼。你可以從https://github.com/DaveGamble/cJSON或者源代碼官方網站下載。并上傳至/usr/local/source_code/??

步驟2:下載完成后,需要將源代碼解壓,可以使用以下命令:?

[root@localhost source_code]# tar -zxvf cJSON-1.7.15.tar.gz

?步驟3:解壓后,切換到源代碼目錄:?

[root@localhost source_code]# cd cJSON-1.7.15

步驟4:生成cJSON動態/靜態庫,執行如下指令:?

[root@localhost cJSON-1.7.15]# mkdir build
[root@localhost cJSON-1.7.15]# cd build/
[root@localhost build]# cmake ..
CMake Deprecation Warning at CMakeLists.txt:2 (cmake_minimum_required):Compatibility with CMake < 2.8.12 will be removed from a future version ofCMake.Update the VERSION argument <min> value or use a ...<max> suffix to tellCMake that the project does not need compatibility with older versions.-- The C compiler identification is GNU 8.3.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
******
[root@localhost build]# make && make install
[  2%] Building C object CMakeFiles/cjson.dir/cJSON.c.o
[  4%] Linking C shared library libcjson.so
[  4%] Built target cjson
[  6%] Building C object CMakeFiles/cJSON_test.dir/test.c.o
[  8%] Linking C executable cJSON_test
[  8%] Built target cJSON_test
[ 11%] Building C object tests/CMakeFiles/unity.dir/unity/src/unity.c.o
[ 13%] Linking C static library libunity.a
[ 13%] Built target unity
[ 15%] Building C object tests/CMakeFiles/print_number.dir/print_number.c.o
[ 17%] Linking C executable print_number
-- 省略--
[100%] Built target fuzz_main
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/include/cjson/cJSON.h
-- Installing: /usr/local/lib64/pkgconfig/libcjson.pc
-- Installing: /usr/local/lib64/libcjson.so.1.7.15
-- Installing: /usr/local/lib64/libcjson.so.1
-- Installing: /usr/local/lib64/libcjson.so
-- Installing: /usr/local/lib64/cmake/cJSON/cjson.cmake
-- Installing: /usr/local/lib64/cmake/cJSON/cjson-noconfig.cmake
-- Installing: /usr/local/lib64/cmake/cJSON/cJSONConfig.cmake
-- Installing: /usr/local/lib64/cmake/cJSON/cJSONConfigVersion.cmake

遇到的問題及解決辦法

編譯執行./test_cjson,提示如下截圖錯誤信息:

[root@localhost cJSON_demo]# ./test_cjson
./test_cjson: error while loading shared libraries: libcjson.so.1: cannot open shared object file: No such file or directory

從報錯的原因上看,本機上沒有找到cJOSN類庫的靜態庫/動態庫libcjson.so。

首先檢查/usr/local/lib 和/usr/local/include 目錄中是否包含cjson 靜態或動態庫,可以執行如下指令:

ls /usr/local/lib | grep cjson
ls /usr/local/include | grep cjson

從上面分組 查詢結果可知:cjson 沒有在/usr/local/lib 庫中生成cjson 靜態/動態庫鏈接。

再次查看cJOSN 在執行make && make install 指令時,對應cJSON 靜態/動態庫生成鏈接存放目錄地址。

從上述截圖可知cJSON 靜態/動態庫被安裝到了/usr/local/lib64 目錄中。

將/usr/local/lib64 目錄添加至本機靜態/動態庫鏈接目錄文件中,執行如下指令:

[root@localhost cJSON_demo]# cat /etc/ld.so.conf.d/usr-libs.conf
/usr/local/lib
[root@localhost cJSON_demo]# vi /etc/ld.so.conf.d/usr-libs.conf
[root@localhost ~]#  cat /etc/ld.so.conf.d/usr-libs.conf
/usr/local/lib
/usr/local/lib64
[root@localhost cJSON_demo]# sudo ldconfig

再次編譯執行./test_cjson, Main 函數正確輸出。

cJSON快速入門

在/usr/local/source_code 新增?cJSON_demo目錄并新增test_cjson.c?文件,文件內容如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cjson/cJSON.h>int main()
{cJSON *json = NULL;cJSON *node = NULL;cJSON *tnode = NULL;cJSON *tnode2 = NULL;char *json_data = NULL;int i, j, size, size2;char *data = "{\"serialNumber\":\"212089842348362300\", \\"cellularInfo\":\[\{\"name\":\"ethernet0/0/1\",\\"switch\":\"0\"},\{\"name\":\"ethernet0/0/2\",\\"switch\":\"1\"},\{\"name\":\"ethernet0/0/3\",\\"switch\":\"0\"}\],\\"family\":[\"father\",\"mother\",\"brother\",\"sister\",\"somebody\"]\}";json = cJSON_Parse(data);json_data = cJSON_Print(json);printf("data: %s\n", json_data);free(json_data);node = cJSON_GetObjectItem(json,"serialNumber");if(node == NULL)printf("serialNumber: no\n");elseprintf("serialNumber: ok\n");node = cJSON_GetObjectItem(json, "family");if (node == NULL)printf("family: no\n");elseprintf("family: ok\n");if (node->type == cJSON_Array){printf("family array size is %d\n", cJSON_GetArraySize(node));size = cJSON_GetArraySize(node);for (i=0; i<size; i++){tnode = cJSON_GetArrayItem(node, i);if (tnode->type == cJSON_String)printf("%d: %s\n", i, tnode->valuestring);elseprintf("node type is not string, value = %d\n", tnode->type);}}node = cJSON_GetObjectItem(json, "cellularInfo");if(node == NULL)printf("cellularInfo: no\n");elseprintf("cellularInfo: ok\n");if (node->type == cJSON_Array){printf("cellularInfo array size is %d\n", cJSON_GetArraySize(node));size = cJSON_GetArraySize(node);for (i=0; i<size; i++){tnode = cJSON_GetArrayItem(node, i);if (tnode->type == cJSON_String)printf("%d: %s\n", i, tnode->valuestring);else if (tnode->type == cJSON_Object){size2 = cJSON_GetArraySize(tnode);for (j=0; j<size2; j++){tnode2 = cJSON_GetArrayItem(tnode, j);if (tnode2->type == cJSON_String)printf("%d-%d: %s\n", i, j, tnode2->valuestring);elseprintf("tnod2 type is err\n");}}elseprintf("node type is not string, value = %d\n", tnode->type);}}cJSON_Delete(json);return 0;
}

編譯源碼并執行:

[root@localhost cJSON_demo]# gcc -o test_cjson test_cjson.c -lcjson
[root@localhost cJSON_demo]# ./test_cjson
data: {"serialNumber": "212089842348362300","cellularInfo": [{"name": "ethernet0/0/1","switch":       "0"}, {"name": "ethernet0/0/2","switch":       "1"}, {"name": "ethernet0/0/3","switch":       "0"}],"family":       ["father", "mother", "brother", "sister", "somebody"]
}
serialNumber: ok
family: ok
family array size is 5
0: father
1: mother
2: brother
3: sister
4: somebody
cellularInfo: ok
cellularInfo array size is 3
0-0: ethernet0/0/1
0-1: 0
1-0: ethernet0/0/2
1-1: 1
2-0: ethernet0/0/3
2-1: 0

cJSON 參考資料

cJSON Github 官網地址:https://github.com/DaveGamble/cJSON

cJSON 開發參考:?https://zhuanlan.zhihu.com/p/55095477?utm_oi=892471685738024960

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/162311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/162311.shtml
英文地址,請注明出處:http://en.pswp.cn/news/162311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Rxjava詳解】(三)更好實踐異步請求

本文為更像demo的總結&#xff0c;在實際開發中&#xff0c;利用rxjava采取異步請求在一些簡單的單純請求數據上面&#xff0c;會顯得沒有必要&#xff0c;但rxjava提供的思路&#xff0c;在后期不論是增加功能&#xff0c;還是說整體代碼的工整度&#xff0c;都能感受到開發的…

補充:自動化測試高級應用之python多線程的使用-新方法

前段時間在網上學習多線程跑用例的時,發現一種更簡潔,優雅的使用多線程的方法,在此分享給大家。 閱讀本文前,請先閱讀前面寫的多線程跑用例的文章:【精選】第七章 第四節 自動化測試高級應用之python多線程的使用_add_test_img-CSDN博客 本文新的方法,對原有的run_al…

接口傳參數list的時候,items里面放個???????list

item里面放個list 先定義一個 list&#xff0c;循環add加入參數

java之switch case的用法

java之switch case的用法 Java中的switch語句是一種多路選擇結構&#xff0c;它允許一個變量在其值的多個可能選項之間進行選擇。這種結構可以替代一系列嵌套的if-else語句&#xff0c;使代碼更清晰和簡潔。 下面是switch語句的基本語法&#xff1a; switch (expression) { …

android keylayout鍵值適配

1、通過getevent打印查看當前keyevent數字對應事件和物理碼 2、dumpsys input 查看輸入事件對應的 KeyLayoutFile: /system/usr/keylayout/Vendor_6080_Product_8060.kl 3、通過物理碼修改鍵值映射&#xff0c;修改/system/usr/keylayout/目錄下的文件

CuratorFramework的blockUntilConnected方法

CuratorFramework是一個ZooKeeper客戶端庫&#xff0c;它提供了一些用于處理ZooKeeper連接和節點操作的高級API。其中&#xff0c;blockUntilConnected方法是一個阻塞方法&#xff0c;它會一直阻塞直到客戶端成功連接到ZooKeeper服務器。 具體來說&#xff0c;blockUntilConne…

(三)、基于 LangChain 實現大模型應用程序開發 | 模型鏈 Chains

&#x1f604; 為什么我們需要Chains &#xff1f; 鏈允許我們將多個組件組合在一起&#xff0c;以創建一個單一的、連貫的應用程序。鏈&#xff08;Chains&#xff09;通常將一個LLM&#xff08;大語言模型&#xff09;與提示結合在一起&#xff0c;使用這個構建塊&#xff0…

永久免費!N個excel表一鍵合并成一個表(excel表格合并技巧)

您是否還在用手工復制粘貼來將多個EXCEL或表的數據合并到一個表里&#xff1f;那就太麻煩&#xff0c;效率太低了&#xff0c;用金鳴表格文字識別的“表格合并”功能&#xff0c;可免費將N個excel文件或N個excel表一鍵合并到一個表里面&#xff0c;而且這個功能永久免費&#x…

【C++】特殊類設計 {不能被拷貝的類;只能在堆上創建的類;只能在棧上創建的類;不能被繼承的類;單例模式:懶漢模式,餓漢模式}

一、不能被拷貝的類 設計思路&#xff1a; 拷貝只會發生在兩個場景中&#xff1a;拷貝構造和賦值重載&#xff0c;因此想要讓一個類禁止拷貝&#xff0c;只需讓該類不能調用拷貝構造以及賦值重載即可。 C98方案&#xff1a; 將拷貝構造與賦值重載只聲明不定義&#xff0c;并…

FDG6306P PowerTrench? MOSFET P溝道 特點及其應用詳解

關于PowerTrench MOSFET&#xff1f; 它是一種MOS場效應晶體管&#xff0c;可以提高系統效率和功率密度。該技術采用了屏蔽柵極技術&#xff0c;可以減少開關損耗和導通損耗&#xff0c;從而提高了系統效率。此外&#xff0c;PowerTrench MOSFET還具有低導通電阻和高開關速度的…

三角洲雜志三角洲雜志社三角洲編輯部2023年第19期目錄

作家在線 李明聰 把寫作當成一種享受 李明聰; 2 頭條作品 冬天的童話 王排; 5-7 迎來春色換人間 王排; 8《三角洲》投稿&#xff1a;cnqikantg126.com 小說精選 鋼哥 曹茂炯; 9-25 重逢 莫艷陽; 26 散文現場 孩子&#xff0c;你相信光嗎&#xff1f; 趙…

前端js語音朗讀文本

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>語音朗讀</title></head><body>&l…

如何滿足BMW EDI項目的PKT需求?

近期寶馬BMW&#xff08;以下簡稱BMW&#xff09;在其部分供應商之間試點推進PKT項目&#xff0c;BMW為什么要啟動 PKT 計劃呢&#xff1f; 業務系統全面升級統一全球所有寶馬工廠的流程 寶馬內部的物流供貨流程 近期BMW PKT需求主要針對其內部物流供貨流程展開&#xff1a; …

嵌入式開發--賽普拉斯cypress的鐵電存儲器FM25CL64B

嵌入式開發–賽普拉斯cypress的鐵電存儲器FM25CL64B 簡介 FM25CL64B是賽普拉斯cypress出品的一款鐵電存儲器&#xff0c;這種存儲器最大的優勢是可以像RAM一樣隨機存儲&#xff0c;和按字節寫入&#xff0c;也可以像ROM一樣掉電仍然可以保存數據&#xff0c;是一種相當優秀的…

Redis 持久化機制

client Redis[內存] --> 內存數據、磁盤數據----> 磁盤&#xff0c;Redis官方提供了兩種不同的持久化方案將內存中的數據存儲在硬盤中&#xff1a; 快照&#xff08;Snapshot&#xff09; AOF只追加日志文件。 1、快照&#xff08;Snapshot&#xff09; 1、快照的特點…

如何用CHAT解釋文章含義?

問CHAT&#xff1a;解釋“ 本身樂善好施&#xff0c;令名遠近共欽&#xff0c;待等二十左右&#xff0c;定有高親可攀&#xff1b;而且四德俱備&#xff0c;幫夫之緣亦有。主持家事不紊&#xff0c;上下亦無閑言。但四十交進&#xff0c;家內謹防口舌&#xff0c;須安家堂&…

分布式篇---第一篇

系列文章目錄 文章目錄 系列文章目錄前言一、分布式冪等性如何設計?二、簡單一次完整的 HTTP 請求所經歷的步驟?三、說說你對分布式事務的了解前言 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站,這篇文章男女通用,…

非遺之光:十八數藏柏松數字保護的璀璨之路

隨著數字技術的崛起&#xff0c;非物質文化遺產的保護進入了一個新的紀元。在這個時代的先鋒中&#xff0c;十八數藏以其對傳統工藝的數字保護而獨領風騷。這是一條璀璨之路&#xff0c;通過數字技術的應用&#xff0c;為傳統工藝注入了新的活力。 十八數藏柏松將數字創新融入傳…

軟件包管理器yum和git

目錄 一、Linux軟件包管理器yum 1、Linux下的軟件安裝方法 2、了解yum 1、實際例子引入 2、yum 3、查找軟件包 4、安裝軟件包 5、卸載軟件 二、git 一、Linux軟件包管理器yum 1、Linux下的軟件安裝方法 1、在Linux下安裝軟件&#xff0c;一個通常的辦法是下載到程序的源…

c 一維數組轉為二維數組

通過數組指針來轉換 用這種方法可以把屏幕mmap 中的數據轉為二維的長乘高的數據 #include <stdio.h>int main() {int mm[5] { 0,1,2,3,4 };int (*pm)[3] (int (*)[3])mm; //pm 排 &#xff0c;[3]表示列printf("%d\n", pm[0][2]); // {0,1,2}…