資料介紹
軟件簡介
介紹
該庫為輕量級的c++ json解析與構(gòu)造庫,源碼很短,適合學(xué)習(xí),覺得不錯的點個star。
提供了的功能:
- json字符串解析為c++對象(JSONArray和JSONObject)
- c++對象中獲取key-value值
- c++對象轉(zhuǎn)化為json字符串
除此之外,由于json支持了多種數(shù)據(jù)類型,還可以將JSONArray對象看成是python的list,JSONObject看成是python的dict,庫中提供了方便操作的api函數(shù)。例如以下初始化方法,
JSONArray arr = {123.4, "dfsdf", 23, nullptr}; // 類似于python的list
JSONArray arr2 = LIST(1.23, "sdfsdg", 234, nullptr); //提供一個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"),
))),
); // 提供了一個初始化宏,類似于python的dict
// 注:使用OBJECT LIST初始化宏的目的是為了替代{}來進行初始化,因為有時候大括號看起來會不夠直觀。
實現(xiàn)該庫的一些技巧:
-
參考boost any.hpp ,實現(xiàn)一個可以在容器里容納任意類型的對象
-
typeid 進行類型的判斷
-
使用了很多遞歸方法
編譯
編譯依賴:
- cmake
- gcc
如果是windows平臺推薦使用cygwin套件(可以在windows下編譯linux軟件),配合clion,開發(fā)起來挺方便的。
例如windows平臺下(linux下類似),編譯靜態(tài)庫的方法如下,編譯成功后在build目錄下生成libSimpleJson.a靜態(tài)庫。
編譯測試程序方法如下:(-lSimpleJson參數(shù)表示鏈接libSimpleJson.a靜態(tài)庫)
提供方便的API
這里Json支持的類型有int, float, double, const char* , string, nullptr(cpp中的空指針)
-
JSON Array
-
使用 [] 操作符寫入數(shù)據(jù),可以使用cout直接打印輸出
JSONArray test1(2); // 初始化分配大小,可以會自動拓展容量 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對象 arr.add(123456) // 整數(shù) .add(234.235236) //浮點數(shù) .add("字符串") //字符串 .add(nullptr); // null測試 -
get方法獲取數(shù)值
例如?
float f = test1.get?,如果類型不正確的話會拋出異常(2); -
toString方法轉(zhuǎn)換為字符串,toString可選參數(shù),代表縮進的數(shù)量。
例如?
test1.toString(4)?表示4空格縮進
-
-
JSON Object
-
使用 [] 來寫入數(shù)據(jù)
// 使用[] 操作對象 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的嵌套使用,這是我自己想出來的,有興趣的朋友可以看下我的實現(xiàn)方法,討論下有沒有更加優(yōu)秀的實現(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"}}}, // 列表嵌套 {"列表嵌套對象和列表", { {{"key1", 1234}}, // 被認(rèn)為是對象 {"key1", 1234}, // 被認(rèn)為是列表 1.23, 234325 }}, {"對象", { // 所有的值都是{key, value}對則認(rèn)為是嵌套對象 {"a obj", 1234566}, {"b obj", "b obj value"}, }} };這種方法有時候還是有點不夠直觀,所以我弄了一個宏,使得編寫json時更加直觀
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"), );這里有三個宏,分別是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) // 浮點數(shù) .add("string", "this is a string") // 英文字符串 .add("中文", "這是中文字符串。。。") // 中文字符串 .add("symbols ",.[]@!#$%^", "含有特殊符號"") // 特殊符號 .add("list", {1, 2.34, "english string", 123.4, "中文字符串"}) // 列表 .add("this is null", nullptr) // null測試 .add("object", {{"key1", "value1"}, {"key2", 223}, {"key3", 23.4}}); // 對象 -
get 方法獲取數(shù)值
例如,?
obj->get?可以獲取到鍵為string的值。("string") -
toString方法輸出字符串,參數(shù)為縮進的數(shù)量
例如4空格縮進如下(
obj.toString(4))無縮進(
obj.toString(-1))無空格縮進(
?obj.toString(0))
-
-
字符串轉(zhuǎn)換為json對象
由于我們不知道字符串是array還是object,我們使用JSONBase類來接受返回的結(jié)果。
(JSONBase中有isJSONArray 和 isJSONArray 方法,可以方便我們進行類型判斷)
例如以下,
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異常。
- Keil環(huán)境下Jansson解析庫的使用——基于STM32F103
- C和C++實物精選《C專家編程》 0次下載
- C和C++經(jīng)典著作《C和指針》 0次下載
- C語言簡單數(shù)據(jù)解析
- C++常見設(shè)計模式解析與實現(xiàn) 11次下載
- 單片機最小JSON解析,含編寫了一個非常簡單的JSON資料下載
- 面向NoSQL數(shù)據(jù)庫的JSON文檔異常檢測模型 20次下載
- 如何深度解析C++拷貝構(gòu)造函數(shù)詳細資料說明
- C++開源庫的詳細資料合集免費下載
- C++的框架、庫和資源資料匯總大全
- C++的開源庫大全詳細資料說明
- C++的框架、庫和代碼分析的資料大全
- C++程序設(shè)計教程之C++的初步知識的詳細資料說明 31次下載
- c++標(biāo)準(zhǔn)庫手冊 43次下載
- aJson-master(arduino的json解析很好) 78次下載
- 基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:ThreadPoll 722次閱讀
- 使用OpenVINO GenAI API在C++中構(gòu)建AI應(yīng)用程序 1.7k次閱讀
- 基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:SafeQueue 1.1k次閱讀
- 基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:SafeStack 1.1k次閱讀
- 基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:SafeBlockQueue 922次閱讀
- OpenHarmony標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類庫案例:HelloWorld 1.3k次閱讀
- C++中實現(xiàn)類似instanceof的方法 1.3k次閱讀
- C++簡史:C++是如何開始的 1.5k次閱讀
- nuere-簡單小巧快速的字符串解析庫 1.1k次閱讀
- 使用C++編寫通用庫并在 Rust 中使用它 (WASI) 2k次閱讀
- 用C++和Easyx簡單的畫一個星空 2.4k次閱讀
- 如何移植OpenHarmony輕量系統(tǒng) 4k次閱讀
- OpenHarmony、輕量系統(tǒng)、小型系統(tǒng)、標(biāo)準(zhǔn)系統(tǒng)的差異 8.8k次閱讀
- 基于STM32F4的 C++封裝(完整代碼) 1w次閱讀
- C++輸入/輸出流 1.1k次閱讀
下載排行
本周
- 1新一代網(wǎng)絡(luò)可視化(NPB 2.0)
- 3.40 MB | 1次下載 | 免費
- 2冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 1次下載 | 10 積分
- 3MDD品牌三極管MMBT3906數(shù)據(jù)手冊
- 2.33 MB | 次下載 | 免費
- 4MDD品牌三極管S9012數(shù)據(jù)手冊
- 2.62 MB | 次下載 | 免費
- 5LAT1218 如何選擇和設(shè)置外部晶體適配 BlueNRG-X
- 0.60 MB | 次下載 | 3 積分
- 6LAT1216 Blue NRG-1/2 系列芯片 Flash 操作與 BLE 事件的互斥處理
- 0.89 MB | 次下載 | 3 積分
- 7收音環(huán)繞擴音機 AVR-1507手冊
- 2.50 MB | 次下載 | 免費
- 8MS1000TA 超聲波測量模擬前端芯片技術(shù)手冊
- 0.60 MB | 次下載 | 免費
本月
- 1愛華AIWA HS-J202維修手冊
- 3.34 MB | 37次下載 | 免費
- 2PC5502負載均流控制電路數(shù)據(jù)手冊
- 1.63 MB | 23次下載 | 免費
- 3NB-IoT芯片廠商的資料說明
- 0.31 MB | 22次下載 | 1 積分
- 4UWB653Pro USB口測距通信定位模塊規(guī)格書
- 838.47 KB | 5次下載 | 免費
- 5蘇泊爾DCL6907(即CHK-S007)單芯片電磁爐原理圖資料
- 0.04 MB | 4次下載 | 1 積分
- 6蘇泊爾DCL6909(即CHK-S009)單芯片電磁爐原理圖資料
- 0.08 MB | 2次下載 | 1 積分
- 7100W準(zhǔn)諧振反激式恒流電源電路圖資料
- 0.09 MB | 2次下載 | 1 積分
- 8FS8025B USB的PD和OC快充協(xié)議電壓誘騙控制器IC技術(shù)手冊
- 1.81 MB | 1次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191439次下載 | 10 積分
- 5十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183353次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81602次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73822次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻




上傳資料賺積分
評論