資料介紹
軟件簡(jiǎn)介
介紹
該庫(kù)為輕量級(jí)的c++ json解析與構(gòu)造庫(kù),源碼很短,適合學(xué)習(xí),覺得不錯(cuò)的點(diǎn)個(gè)star。
提供了的功能:
- json字符串解析為c++對(duì)象(JSONArray和JSONObject)
- c++對(duì)象中獲取key-value值
- c++對(duì)象轉(zhuǎn)化為json字符串
除此之外,由于json支持了多種數(shù)據(jù)類型,還可以將JSONArray對(duì)象看成是python的list,JSONObject看成是python的dict,庫(kù)中提供了方便操作的api函數(shù)。例如以下初始化方法,
JSONArray arr = {123.4, "dfsdf", 23, nullptr}; // 類似于python的list JSONArray arr2 = LIST(1.23, "sdfsdg", 234, nullptr); //提供一個(gè)LIST初始化宏,類似于python的list JSONObject obj = { {"test obj", {"key", "value"}}, {"int number", 2}, {"float number", 34.3}, {"my string", "fsdfsdg"}, {"nullptr", nullptr}, {"emptylist", {}}, }; // 可以看成是python的dict JSONObject obj2 = OBJECT( KEYVALUE("username", "hhk"), KEYVALUE("obj", OBJECT( KEYVALUE("abcd", LIST(1,2.3, "hahahaha")), KEYVALUE("obj", OBJECT( KEYVALUE("key", "this is obj.obj.key' s value") )) )), KEYVALUE("null", nullptr), KEYVALUE("list", LIST(1, "qwerty", 2.34, OBJECT( KEYVALUE("key", "this is a key"), KEYVALUE("key2", "this is a key2"), ))), ); // 提供了一個(gè)初始化宏,類似于python的dict // 注:使用OBJECT LIST初始化宏的目的是為了替代{}來進(jìn)行初始化,因?yàn)橛袝r(shí)候大括號(hào)看起來會(huì)不夠直觀。
實(shí)現(xiàn)該庫(kù)的一些技巧:
-
參考boost any.hpp ,實(shí)現(xiàn)一個(gè)可以在容器里容納任意類型的對(duì)象
-
typeid 進(jìn)行類型的判斷
-
使用了很多遞歸方法
編譯
編譯依賴:
- cmake
- gcc
如果是windows平臺(tái)推薦使用cygwin套件(可以在windows下編譯linux軟件),配合clion,開發(fā)起來挺方便的。
例如windows平臺(tái)下(linux下類似),編譯靜態(tài)庫(kù)的方法如下,編譯成功后在build目錄下生成libSimpleJson.a靜態(tài)庫(kù)。
編譯測(cè)試程序方法如下:(-lSimpleJson參數(shù)表示鏈接libSimpleJson.a靜態(tài)庫(kù))
提供方便的API
這里Json支持的類型有int, float, double, const char* , string, nullptr(cpp中的空指針)
-
JSON Array
-
使用 [] 操作符寫入數(shù)據(jù),可以使用cout直接打印輸出
JSONArray test1(2); // 初始化分配大小,可以會(huì)自動(dòng)拓展容量 test1[0] = nullptr; test1[1] = "this is const char*"; test1[2] = 12324.5; test1[5] = "中文字符串"; cout << test1 << endl;
-
初始化列表構(gòu)造函數(shù)與鏈?zhǔn)讲僮?/p>
JSONArray arr = {123.4, "dfsdf", 23, nullptr}; // 初始化列表 arr[0] = 12.314; arr[2] = 2335; arr[3] = "字符串"; arr[6] = obj; // json對(duì)象 arr.add(123456) // 整數(shù) .add(234.235236) //浮點(diǎn)數(shù) .add("字符串") //字符串 .add(nullptr); // null測(cè)試
-
get方法獲取數(shù)值
例如?
float f = test1.get
?,如果類型不正確的話會(huì)拋出異常(2); -
toString方法轉(zhuǎn)換為字符串,toString可選參數(shù),代表縮進(jìn)的數(shù)量。
例如?
test1.toString(4)
?表示4空格縮進(jìn)
-
-
JSON Object
-
使用 [] 來寫入數(shù)據(jù)
// 使用[] 操作對(duì)象 JSONObject test2; test2["float"] = 123.456; test2["int"] = 24; test2["string"] = "this is a string"; test2["array"] = test1; test2["nullptr"] = nullptr; cout << test2 << endl;
-
更加復(fù)雜的初始化方法
這種方法看起來比較直觀,支持object和array的嵌套使用,這是我自己想出來的,有興趣的朋友可以看下我的實(shí)現(xiàn)方法,討論下有沒有更加優(yōu)秀的實(shí)現(xiàn)方式。
// obj初始化方法 JSONObject obj = { {"test obj", {"key", "value"}}, {"int number", 2}, {"float number", 34.3}, {"my string", "fsdfsdg"}, {"nullptr", nullptr}, {"emptylist", {}}, {"列表嵌套列表", {1,2.3, "sdf", {1,2.242, "float"}}}, // 列表嵌套 {"列表嵌套對(duì)象和列表", { {{"key1", 1234}}, // 被認(rèn)為是對(duì)象 {"key1", 1234}, // 被認(rèn)為是列表 1.23, 234325 }}, {"對(duì)象", { // 所有的值都是{key, value}對(duì)則認(rèn)為是嵌套對(duì)象 {"a obj", 1234566}, {"b obj", "b obj value"}, }} };
這種方法有時(shí)候還是有點(diǎn)不夠直觀,所以我弄了一個(gè)宏,使得編寫json時(shí)更加直觀
JSONObject context = OBJECT( KEYVALUE("username", "hhk"), KEYVALUE("obj", OBJECT( KEYVALUE("abcd", LIST(1,2.3, "hahahaha")), KEYVALUE("obj", OBJECT( KEYVALUE("key", "this is obj.obj.key' s value") )) )), KEYVALUE("null", nullptr), KEYVALUE("list", LIST(1, "qwerty", 2.34, OBJECT( KEYVALUE("key", "this is a key"), KEYVALUE("key2", "this is a key2"), ))), KEYVALUE("list1", LIST(1,2,3,4,5)), KEYVALUE("list2", LIST(1,2,3)), KEYVALUE("obj2", OBJECT( KEYVALUE("key1", "value1"), KEYVALUE("key2", 222), KEYVALUE("key3", 333), )), KEYVALUE("a", "111"), KEYVALUE("b", "222"), KEYVALUE("c", "333"), );
這里有三個(gè)宏,分別是OBJECT,KEYVALUE, LIST。
-
支持鏈?zhǔn)絘dd的操作
obj["int"] = 12325; obj["float"] = 24235.235235; obj["string"] = "this is a string2"; obj["null"] = nullptr; obj.add("int", 123) // 整數(shù) .add("float", 23.2324) // 浮點(diǎn)數(shù) .add("string", "this is a string") // 英文字符串 .add("中文", "這是中文字符串。。。") // 中文字符串 .add("symbols ",.[]@!#$%^", "含有特殊符號(hào)"") // 特殊符號(hào) .add("list", {1, 2.34, "english string", 123.4, "中文字符串"}) // 列表 .add("this is null", nullptr) // null測(cè)試 .add("object", {{"key1", "value1"}, {"key2", 223}, {"key3", 23.4}}); // 對(duì)象
-
get 方法獲取數(shù)值
例如,?
obj->get
?可以獲取到鍵為string的值。("string") -
toString方法輸出字符串,參數(shù)為縮進(jìn)的數(shù)量
例如4空格縮進(jìn)如下(
obj.toString(4)
)無縮進(jìn)(
obj.toString(-1)
)無空格縮進(jìn)(
?obj.toString(0)
)
-
-
字符串轉(zhuǎn)換為json對(duì)象
由于我們不知道字符串是array還是object,我們使用JSONBase類來接受返回的結(jié)果。
(JSONBase中有isJSONArray 和 isJSONArray 方法,可以方便我們進(jìn)行類型判斷)
例如以下,
string parse_str = R"({"name" : "hhk" , "key1": "valu"e1 ","key2":[1,2,"asd",{"sadf": 123, "sb": 12.3}, 123.3]})"; JSONBase* a = JSONBase::parse(parse_str); cout << *a << endl; JSONObject *b = dynamic_cast
(a); //類型轉(zhuǎn)換 cout << b->get ("key1") << endl; cout << b->get ("key2").get (1) << endl; parse方法用于不知道字符串是array還是object,parse_obj方法返回JSONObject,parse_arr方法返回JSONArray。(parse_obj,parse_arr用于明確知道字符串的類型)
如果字符串不是json字符串,則拋出JSONParseException異常。
- 基于Json格式的文本視圖驗(yàn)證工具 8次下載
- Keil環(huán)境下Jansson解析庫(kù)的使用——基于STM32F103 7次下載
- C和C++實(shí)物精選《C專家編程》 0次下載
- C和C++經(jīng)典著作《C和指針》 0次下載
- C語言簡(jiǎn)單數(shù)據(jù)解析 8次下載
- 自編適用于嵌入式單片機(jī)Json封包與解析的程序 12次下載
- C++常見設(shè)計(jì)模式解析與實(shí)現(xiàn) 11次下載
- 單片機(jī)最小JSON解析,含編寫了一個(gè)非常簡(jiǎn)單的JSON資料下載 13次下載
- 面向NoSQL數(shù)據(jù)庫(kù)的JSON文檔異常檢測(cè)模型 20次下載
- Visual C++和MFC創(chuàng)建的應(yīng)用程序基礎(chǔ)知識(shí) 0次下載
- 如何深度解析C++拷貝構(gòu)造函數(shù)詳細(xì)資料說明 0次下載
- C++程序設(shè)計(jì)教程之C++的初步知識(shí)的詳細(xì)資料說明 31次下載
- C++的G代碼解析算法研究 0次下載
- aJson-master(arduino的json解析很好) 77次下載
- JSON教程 29次下載
- GitHub Copilot+ESP開發(fā)實(shí)戰(zhàn)-串口 52次閱讀
- vb語言和c++語言的區(qū)別 386次閱讀
- nuere-簡(jiǎn)單小巧快速的字符串解析庫(kù) 312次閱讀
- TorchVision框架下模型導(dǎo)出并部署到ONNXRUNTIME C++全流程解析 685次閱讀
- 怎么用C+JS結(jié)構(gòu)來處理JSON數(shù)據(jù)? 468次閱讀
- 分享幾個(gè)格式化輸出json文件的方法 4657次閱讀
- 用C++和Easyx簡(jiǎn)單的畫一個(gè)星空 1330次閱讀
- C++語言的發(fā)展 464次閱讀
- 在Python中高效使用JSON的四種方法 2388次閱讀
- C++:引用的使用場(chǎng)景 3795次閱讀
- C++封裝:this指針 3191次閱讀
- C++封裝:類的作用域和實(shí)例化 3267次閱讀
- 基于STM32F4的 C++封裝(完整代碼) 9386次閱讀
- 解析c++語言的Qt內(nèi)省機(jī)制 1379次閱讀
- 自動(dòng)根據(jù)json字符串生成javabean類 6239次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多