<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
cJSON 是一個超輕巧,攜帶方便,單檔案,可以作為 ANSI-C 標準的 JSON 解析器,是一個用C語言編寫的簡單好用的JSON解析器;它只包含一個C檔案和一個標頭檔案,可以非常容易整合到自己工程專案中。
並且cJSON是用ANSI C(C89)編寫的,可以相容所有支援C語言的平臺和編譯器。
cJSON下載地址: https://sourceforge.net/projects/cjson/
cJSON的GitHub倉庫地址:https://github.com/DaveGamble/cJSON
JSON是JavaScript Object Notation(JavaScript物件表示法),是一種輕量級的資料交換格式。
JSON主要是用來儲存和交換文字資訊,類似XML格式;但是JSON比XML更小、更快,更易解析。
JSON是基於ECMAScript (歐洲計算機協會制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。
簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。 比如: Web伺服器介面基本都是採用JSON反饋資料,採用JSON格式字串來描述符資訊。 JSON檔案的字尾一般是.json,這個只是為了方便辨識。
簡單的說,JSON就是按照指定格式序列化的字串,就算不使用任何現成的解析庫,自己也可以按照正常解析字串的思路去解析;有現成的標準JSON解析庫,那就大大減輕了我們的工作量。
JSON格式的資料範例: 這是表示當前時間的JSON字串
{ "success": "1", "result": { "timestamp": "1631849514", "datetime_1": "2021-09-17 20:31:54", "datetime_2": "2021年09月17日 20時31分54秒", "week_1": "5", "week_2": "星期五", "week_3": "週五", "week_4": "Friday" } }
JSON格式的資料範例: 這是表示未來幾天天氣預報的json字串
{ "success": "1", "result": [ { "weaid": "1", "days": "2021-09-17", "week": "星期五", "cityno": "beijing", "citynm": "北京", "cityid": "101010100", "temperature": "26℃/17℃", "humidity": "0%/0%", "weather": "晴", "weather_icon": "http://api.k780.com/upload/weather/d/0.gif", "weather_icon1": "http://api.k780.com/upload/weather/n/0.gif", "wind": "北風轉西南風", "winp": "小於3級", "temp_high": "26", "temp_low": "17", "humi_high": "0", "humi_low": "0", "weatid": "1", "weatid1": "1", "windid": "8", "winpid": "0", "weather_iconid": "0", "weather_iconid1": "0" }, { "weaid": "1", "days": "2021-09-18", "week": "星期六", "cityno": "beijing", "citynm": "北京", "cityid": "101010100", "temperature": "25℃/17℃", "humidity": "0%/0%", "weather": "多雲", "weather_icon": "http://api.k780.com/upload/weather/d/1.gif", "weather_icon1": "http://api.k780.com/upload/weather/n/1.gif", "wind": "西南風", "winp": "小於3級", "temp_high": "25", "temp_low": "17", "humi_high": "0", "humi_low": "0", "weatid": "2", "weatid1": "2", "windid": "5", "winpid": "0", "weather_iconid": "1", "weather_iconid1": "1" }, { "weaid": "1", "days": "2021-09-19", "week": "星期日", "cityno": "beijing", "citynm": "北京", "cityid": "101010100", "temperature": "19℃/15℃", "humidity": "0%/0%", "weather": "小雨轉中雨", "weather_icon": "http://api.k780.com/upload/weather/d/7.gif", "weather_icon1": "http://api.k780.com/upload/weather/n/8.gif", "wind": "西南風轉北風", "winp": "小於3級轉小於3級", "temp_high": "19", "temp_low": "15", "humi_high": "0", "humi_low": "0", "weatid": "8", "weatid1": "9", "windid": "5", "winpid": "0", "weather_iconid": "7", "weather_iconid1": "8" }, { "weaid": "1", "days": "2021-09-20", "week": "星期一", "cityno": "beijing", "citynm": "北京", "cityid": "101010100", "temperature": "26℃/16℃", "humidity": "0%/0%", "weather": "多雲轉晴", "weather_icon": "http://api.k780.com/upload/weather/d/1.gif", "weather_icon1": "http://api.k780.com/upload/weather/n/0.gif", "wind": "北風", "winp": "3-4級轉3-4級", "temp_high": "26", "temp_low": "16", "humi_high": "0", "humi_low": "0", "weatid": "2", "weatid1": "1", "windid": "8", "winpid": "1", "weather_iconid": "1", "weather_iconid1": "0" }, { "weaid": "1", "days": "2021-09-21", "week": "星期二", "cityno": "beijing", "citynm": "北京", "cityid": "101010100", "temperature": "27℃/16℃", "humidity": "0%/0%", "weather": "晴", "weather_icon": "http://api.k780.com/upload/weather/d/0.gif", "weather_icon1": "http://api.k780.com/upload/weather/n/0.gif", "wind": "西北風轉北風", "winp": "小於3級", "temp_high": "27", "temp_low": "16", "humi_high": "0", "humi_low": "0", "weatid": "1", "weatid1": "1", "windid": "7", "winpid": "0", "weather_iconid": "0", "weather_iconid1": "0" }, { "weaid": "1", "days": "2021-09-22", "week": "星期三", "cityno": "beijing", "citynm": "北京", "cityid": "101010100", "temperature": "26℃/18℃", "humidity": "0%/0%", "weather": "多雲", "weather_icon": "http://api.k780.com/upload/weather/d/1.gif", "weather_icon1": "http://api.k780.com/upload/weather/n/1.gif", "wind": "北風轉東北風", "winp": "小於3級", "temp_high": "26", "temp_low": "18", "humi_high": "0", "humi_low": "0", "weatid": "2", "weatid1": "2", "windid": "8", "winpid": "0", "weather_iconid": "1", "weather_iconid1": "1" }, { "weaid": "1", "days": "2021-09-23", "week": "星期四", "cityno": "beijing", "citynm": "北京", "cityid": "101010100", "temperature": "24℃/16℃", "humidity": "0%/0%", "weather": "多雲", "weather_icon": "http://api.k780.com/upload/weather/d/1.gif", "weather_icon1": "http://api.k780.com/upload/weather/n/1.gif", "wind": "東北風", "winp": "小於3級", "temp_high": "24", "temp_low": "16", "humi_high": "0", "humi_low": "0", "weatid": "2", "weatid1": "2", "windid": "1", "winpid": "0", "weather_iconid": "1", "weather_iconid1": "1" } ] }
JSON裡就分為兩種結構: 物件和陣列,通過這兩種結構可以表示各種複雜的結構。
JSON語法規則
1. 大括號 { } 用來儲存物件
2. 中括號 [ ] 用來儲存陣列,陣列裡也可以包含多個物件,物件裡又可以包含陣列,可以巢狀
3. JSON的值表示語法: key : value --> "width": 1280
4. 多個資料由逗號分隔: {"width": 1920,"height": 1080}
JSON值可以是以下幾種型別:
1. 數位(整數或浮點數)
2. 字串(在雙引號中)
3. 邏輯值(true 或 false)
4. 陣列(在中括號中)
5. 物件(在大括號中)
6. null (空值)
這是下載下來的cJSON原始檔,將它加到自己工程中即可。
我這裡使用VS2017建立工程,演示範例。
建好工程之後,將檔案新增到工程裡:
在VS2017裡使用C語言的字串處理常式會報錯,提示不安全;
1>d:linux-share-dirvs2017console_cjsontestconsole_cjsontestcjson.c(155): error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
解決辦法是:找到【專案屬性】,點選【C++】裡的【前處理器】,對【前處理器】進行編輯,在裡面加入一段程式碼:_CRT_SECURE_NO_WARNINGS。
接下來目標是使用cJSON建立出下面這樣一個JSON格式資料:
{ "text": "我是一個字串資料", "number": 666, "state1": false, "state2": true, "state3": null }
範例程式碼如下:
#include <iostream> //因為當前工程使用的是cpp字尾檔案,參照C語言的檔案需要使用下面的這種方式 extern "C" { #include <string.h> #include <stdio.h> #include "cJSON.h" } int main() { //1. 建立cJSON物件 cJSON* root = cJSON_CreateObject(); //2. 建立資料 cJSON_AddStringToObject(root, "text","我是一個字串資料"); cJSON_AddNumberToObject(root,"number",666); cJSON_AddBoolToObject(root, "state1", cJSON_False); cJSON_AddBoolToObject(root, "state2", cJSON_True); cJSON_AddNullToObject(root, "state3"); //3. 列印生成的結果 char *json_data=cJSON_PrintUnformatted(root); printf("%sn",json_data); //4. 釋放空間 cJSON_Delete(root); return 0; }
#include <iostream> //因為當前工程使用的是cpp字尾檔案,參照C語言的檔案需要使用下面的這種方式 extern "C" { #include <string.h> #include <stdio.h> #include "cJSON.h" } //將要解析的JSON資料. char data[] = "{" ""text": "我是一個字串資料"," ""number" : 666," ""state1" : false," ""state2" : true," ""state3" : null" "}"; int main() { //1. 載入JSON資料 cJSON* root = cJSON_Parse(data); if (root == NULL)return 0; //2. 解析欄位 cJSON* item; item=cJSON_GetObjectItem(root,"text"); if (item) { printf("text=%sn",item->valuestring); } item = cJSON_GetObjectItem(root, "number"); if (item) { printf("text=%dn", item->valueint); } item = cJSON_GetObjectItem(root, "state1"); if (item) { printf("state1=%dn", item->valueint); } item = cJSON_GetObjectItem(root, "state2"); if (item) { printf("state2=%dn", item->valueint); } item = cJSON_GetObjectItem(root, "state3"); if (item) { printf("state3=%dn", item->valueint); } //3. 釋放空間 cJSON_Delete(root); return 0; }
目標: 使用cJSON建立出下面這樣一個JSON格式資料
{ "data1": { "text": "我是一個字串資料1", "number": 666, "state1": false, "state2": true, "state3": null }, "data2": { "text": "我是一個字串資料2", "number": 666, "state1": false, "state2": true, "state3": null } }
#include <iostream> //因為當前工程使用的是cpp字尾檔案,參照C語言的檔案需要使用下面的這種方式 extern "C" { #include <string.h> #include <stdio.h> #include "cJSON.h" } int main() { //1. 建立cJSON物件 cJSON* root = cJSON_CreateObject(); //2. 建立物件資料1 cJSON* item1 = cJSON_CreateObject(); cJSON_AddStringToObject(item1, "text","我是一個字串資料1"); cJSON_AddNumberToObject(item1,"number",666); cJSON_AddBoolToObject(item1, "state1", cJSON_False); cJSON_AddBoolToObject(item1, "state2", cJSON_True); cJSON_AddNullToObject(item1, "state3"); cJSON_AddItemToObject(root, "data1", item1); //3. 建立物件資料2 cJSON* item2 = cJSON_CreateObject(); cJSON_AddStringToObject(item2, "text", "我是一個字串資料2"); cJSON_AddNumberToObject(item2, "number", 666); cJSON_AddBoolToObject(item2, "state1", cJSON_False); cJSON_AddBoolToObject(item2, "state2", cJSON_True); cJSON_AddNullToObject(item2, "state3"); cJSON_AddItemToObject(root, "data2", item2); //3. 列印生成的結果 char *json_data=cJSON_PrintUnformatted(root); printf("%sn",json_data); //4. 釋放空間 cJSON_Delete(root); return 0; }
#include <iostream> //因為當前工程使用的是cpp字尾檔案,參照C語言的檔案需要使用下面的這種方式 extern "C" { #include <string.h> #include <stdio.h> #include "cJSON.h" } //將要解析的JSON資料. char data[] = "{" ""data1": {" ""text": "我是一個字串資料1"," ""number" : 666," ""state1" : false," ""state2" : true," ""state3" : null" "}," ""data2": {" ""text":"我是一個字串資料2"," ""number" : 666," ""state1" : false," ""state2" : true," ""state3" : null" "}" "}"; int main() { //1. 載入JSON資料 cJSON* root = cJSON_Parse(data); if (root == NULL)return 0; //2. 解析欄位 cJSON* item; item=cJSON_GetObjectItem(root,"data1"); if (item) { cJSON *obj; obj=cJSON_GetObjectItem(item, "text"); if (obj) { printf("text=%sn", obj->valuestring); } obj=cJSON_GetObjectItem(item, "number"); if (obj) { printf("number=%dn", obj->valueint); } obj = cJSON_GetObjectItem(item, "state1"); if (obj) { printf("state1=%dn", obj->valueint); } obj = cJSON_GetObjectItem(item, "state2"); if (obj) { printf("state2=%dn", obj->valueint); } obj = cJSON_GetObjectItem(item, "state3"); if (obj) { printf("state3=%dn", obj->valueint); } } item = cJSON_GetObjectItem(root, "data2"); if (item) { cJSON *obj; obj = cJSON_GetObjectItem(item, "text"); if (obj) { printf("text=%sn", obj->valuestring); } obj = cJSON_GetObjectItem(item, "number"); if (obj) { printf("number=%dn", obj->valueint); } obj = cJSON_GetObjectItem(item, "state1"); if (obj) { printf("state1=%dn", obj->valueint); } obj = cJSON_GetObjectItem(item, "state2"); if (obj) { printf("state2=%dn", obj->valueint); } obj = cJSON_GetObjectItem(item, "state3"); if (obj) { printf("state3=%dn", obj->valueint); } } //3. 釋放空間 cJSON_Delete(root); return 0; }
目標: 使用cJSON建立出下面這樣一個JSON格式資料
{ "text": [ { "width": 1280, "height": 720 }, { "width": 1920, "height": 1080 }, { "width": 3840, "height": 2160 } ] }
#include <iostream> //因為當前工程使用的是cpp字尾檔案,參照C語言的檔案需要使用下面的這種方式 extern "C" { #include <string.h> #include <stdio.h> #include "cJSON.h" } int main() { cJSON *width = NULL; cJSON *height = NULL; int i; const unsigned int resolution_numbers[3][2] = { {1280, 720}, {1920, 1080}, {3840, 2160} }; //1. 建立cJSON物件 cJSON* root = cJSON_CreateObject(); //2. 建立陣列物件 cJSON *array = cJSON_CreateArray(); cJSON_AddItemToObject(root, "text", array); for (i = 0; i < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++i) { cJSON *obj = cJSON_CreateObject(); cJSON_AddItemToArray(array, obj); width = cJSON_CreateNumber(resolution_numbers[i][0]); cJSON_AddItemToObject(obj, "width", width); height = cJSON_CreateNumber(resolution_numbers[i][1]); cJSON_AddItemToObject(obj, "height", height); } //3. 列印生成的結果 char *json_data=cJSON_PrintUnformatted(root); printf("%sn",json_data); //4. 釋放空間 cJSON_Delete(root); return 0; }
#include <iostream> //因為當前工程使用的是cpp字尾檔案,參照C語言的檔案需要使用下面的這種方式 extern "C" { #include <string.h> #include <stdio.h> #include "cJSON.h" } //將要解析的JSON資料. char data[] = "{" ""text": [" "{" ""width": 1280," ""height" : 720" "}," "{" ""width": 1920," ""height" : 1080" "}," "{" ""width": 3840," ""height" : 2160" "}" "]" "}"; int main() { //1. 載入JSON資料 cJSON* root = cJSON_Parse(data); if (root == NULL)return 0; //2. 解析欄位 cJSON* item; int i; item = cJSON_GetObjectItem(root, "text"); if (item) { //獲取陣列的大小 int ArraySize = cJSON_GetArraySize(item); //解析陣列的裡的每個成員 for (i = 0; i < ArraySize; i++) { //取出陣列下標物件 cJSON *array_item = cJSON_GetArrayItem(item, i); if (array_item == NULL)continue; //解析資料 cJSON *obj = cJSON_GetObjectItem(array_item, "width"); if (obj) { printf("width=%dn",obj->valueint); } obj = cJSON_GetObjectItem(array_item, "height"); if (obj) { printf("height=%dn", obj->valueint); } } } //3. 釋放空間 cJSON_Delete(root); return 0; }
到此這篇關於C/C++中CJSON的使用(建立與解析JSON資料)的文章就介紹到這了,更多相關C++ CJSON使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45