C++ JSON庫:JSON for Morden C++

緒論

最近因為項目的需要,需要對JSON進行一定的數據處理,因為想要用C++進行編碼,便對C++的JSON庫進行的調研,發現這個庫比較好用:JSON for Morder C++。

使用指南

想要使用這個json庫,只需要在源文件中包含json.hpp頭文件,然后就可以使用nlohmann::json對象啦,非常地簡單,不需要添加動態庫什么的。

序列化

測試代碼

void test_json_serialization() {using json = nlohmann::json;json js;js["msg_type"] = 2; //值可以是任意內置類型js["from"] = "zhang san";js["to"] = "li si";js["msg"] = "Hello, how are you?";js["id"] = {1, 2, 3, 4, 5}; //值可以是數組js["msg1"]["zhang san"] = "I am zhang san";js["msg1"]["li si"] = "I am li si";//等價于下面的寫法,支持對同一個鍵值重復寫入js["msg1"] = {{"zhang san", "I am zhang san"}, {"li si", "I am li si"}};//支持直接用容器給json賦值,json對象指向一個數組js["list"] = std::vector<int>{1,2,3};//如果給json賦值map對象,不會產生map對象,而是產生一個數組//每個數組的元素仍然是一個子數組,這個子數組中有兩個元素,分別是map對象的鍵和值js["path1"] = std::map<int,std::string>{{1,"map1"}, {2,"map2"}};js["path2"] = std::unordered_map<int,std::string>{{1,"unordered_map1"}, {2,"unordered_map2"}};std::string s = js.dump();  //轉儲成字符串 可以使用dump(4)進行縮進edward::print(s);
}

運行結果

{“from”:“zhang san”,
“id”:[1,2,3,4,5],
“list”:[1,2,3],
“msg”:“Hello, how are you?”,
“msg1”:{“li si”:“I am li si”,“zhang san”:“I am zhang san”},
“msg_type”:2,
“path1”:[[1,“map1”],[2,“map2”]],
“path2”:[[2,“unordered_map2”],[1,“unordered_map1”]],
“to”:“li si”}

反序列化

測試代碼

void test_json_deserialization(const std::string& buf) {using json = nlohmann::json;json js = json::parse(buf);edward::print("msg_type:", js["msg_type"]);edward::print("from:", js["from"]);edward::print("to:", js["to"]);edward::print("msg:", js["msg"]);edward::print("id:", js["id"]);edward::printArr(js["id"].begin(), js["id"].end());edward::print("msg1:", js["msg1"]);edward::print("msg1[\"zhang san\"]:", js["msg1"]["zhang san"]);std::vector<int> list = js["list"];std::map<int, string> path1 = js["path1"];std::unordered_map<int, string> path2 = js["path2"];edward::printArr(list);edward::printArr(path1);edward::printArr(path2);
}

運行結果

msg_type: 2
from: “zhang san”
to: “li si”
msg: “Hello, how are you?”
id: [1,2,3,4,5]
1 2 3 4 5
msg1: {“li si”:“I am li si”,“zhang san”:“I am zhang san”}
msg1[“zhang san”]: “I am zhang san”
1 2 3
1 map1 2 map2
1 unordered_map1 2 unordered_map2

其中的print函數和printArr函數都放在我自己的一個工具庫中。詳見我的博客C++ 工具函數庫
如果還想了解更多的細節可以去github上學習更多內容。

源碼解析

看到一個大神對這個庫實現細節的解析,最近也恰好在學習模板,插個眼,我以后也研究一下這個庫的源碼:C++ 常用庫 —— JSON for Modern C++

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

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

相關文章

Linux信號實現精確到微秒的sleep函數:通過sigsuspend函數解決時序競態問題

原理就是先使用定時器定時&#xff0c;然后再使用pause函數或者sigsuspend函數主動阻塞掛起&#xff0c;最終恢復現場。 如果使用pause函數的話&#xff0c;優點是使用簡單&#xff0c;缺點是有可能產生時序競態&#xff0c;導致進程一直阻塞下去&#xff1a;在定時和掛起之間…

Linux創建多個子進程并通過捕獲SIGCHLD信號進行非阻塞回收

我們通過fork函數創建多個子進程&#xff0c;并通過exec函數族在子進程中進行其他的工作&#xff0c;但是為了避免僵尸進程&#xff0c;我們要對子進程進行回收。常用的回收方式是wait或者waitpid進行阻塞回收&#xff0c;因為如果非阻塞回收很難把握時機&#xff0c;而阻塞回收…

Linux創建守護進程

守護進程&#xff08;Daemon&#xff09;是運行在后臺的一種特殊進程。它獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。它不需要用戶輸入就能運行而且提供某種服務&#xff0c;不是對整個系統就是對某個用戶程序提供服務。Linux系統的大多數服務器就是通過…

Linux創建多個子線程并回收

創建子線程的邏輯相比子進程要更容易理解一些&#xff0c;因為線程沒有像進程那樣復制很多東西另起爐灶&#xff0c;子線程從傳入的開始函數開始運行&#xff0c;但是難點在于傳入參數和回收時獲取退出狀態&#xff0c;因為這兩個原本都是void *類型的&#xff0c;而我們在使用…

Qt發布程序

Windows&#xff1a; https://www.cnblogs.com/linuxAndMcu/p/10974927.html Ubuntu&#xff1a; https://blog.csdn.net/u014779536/article/details/107854060

K210入門

之前購買了一個Sipeed Maix M1w Dock k210的開發板&#xff0c;想著自己鼓搗鼓搗&#xff0c;在網上看到了一些好的教程&#xff0c;在這里記錄一下&#xff1a; 嵌入式AI從入門到放肆【K210篇】-- 硬件與環境&#xff1a;介紹了各種開發環境的搭建&#xff0c;但是不是特別詳細…

C++輸入輸出:cin/cout 還是 scanf/printf?

相信使用C的人都有一種迷惑或者是不自信&#xff1a;在輸入輸出的時候是不是應該使用scanf/printf更好呢&#xff0c;因為傳說cin/cout龜速&#xff0c;我當時也長期被這個所困擾&#xff0c;后來在閱讀C primer第五版的時候我自己做了一個測試&#xff0c;發現如果不使用std::…

UVA - 101:The Blocks Problem

原本以為是一道很簡單的模擬題&#xff0c;結果寫了一個小時。。。很長時間不碰算法題&#xff0c;的確手感差很多。不過我覺得隨著刷題慢慢多起來應該會好的。 題目的意思也有點含糊&#xff0c;需要自己去猜&#xff0c;大概意思就是槽里有一堆木頭&#xff0c;每個槽剛開始…

UVA - 12096:The SetStack Computer

題目描述很簡單&#xff0c;難點在于如何對集合進行編碼&#xff0c;因為是無限的&#xff0c;好像沒有一個方向進行編碼。 紫書給的題解十分巧妙&#xff1a;給新出現的集合進行編碼 的確&#xff0c;我們沒有必要為所有可能出現的集合編碼后再開始&#xff0c;我們就可以簡單…

UVA - 540:Team Queue

主要的關鍵在于&#xff1a;不要試圖讓所有團隊的人在一個隊列里面&#xff0c;因為這樣如果新入隊的是一個前面團隊的成員則必須先出隊再入隊。 應該把每個團隊看做一個整體&#xff0c;用一個隊列維護團隊的順序&#xff0c;用t個隊列維護每個團隊內部的順序。 還有就是要維…

UVA-136:Ugly Numbers

很簡單的一道題&#xff0c;但是我竟然蠢到想不明白為什么如果從頭生成會出現大量重復的數字。 寫的時候主要出現的錯誤在爆int上&#xff0c;一定要注意數據范圍。 #include <iostream> #include <queue> #include <set>using namespace std; using ll lo…

類的成員函數可以訪問屬于該類的任意對象的私有變量

之前在書上看到成員函數可以訪問類的私有變量的時候覺得是廢話嘛&#xff0c;如果成員函數都不能訪問那私有變量不就變成了花瓶了。然而發現自己還是太naive。 這句話的意思是&#xff1a;在類的作用域內&#xff0c;包含成員函數、靜態成員函數和友元函數內&#xff0c;可以訪…

GMP使用入門

最近寫了一個高精度的模板&#xff0c;想要用GMP庫測試一下&#xff0c;總結一下GMP環境的搭建。 環境搭建&#xff1a;GMP大法教你重新做人(從入門到實戰) 解壓.tar.lz的 時候可能會遇到一點問題&#xff0c;可以參考這個博客&#xff1a;.tar.lz壓縮包解壓 需要注意的是C需要…

UVA - 400:Unix ls

題目的難點在于要求前面的每一列的是最大長度L2&#xff0c;最后一列的長度是L。對于寬度為WIDTH60的一行來說&#xff0c;一行可以放下多少個單詞決定了需要多少行&#xff0c;知道了行數才能開始根據行數開始放置。 我的做法是col (WIDTH 2) / (L 2)&#xff0c;即提前給W…

UVA - 1592:Database

題目的意思是找到兩行在兩列處相等&#xff0c;主要要做的是記錄某個值是否重復出現過。 經過思考&#xff0c;我的思路是&#xff1a;每一列用一個unordered_map<string,vector<int>>記錄單詞出現的行數&#xff0c;對于某一行中的兩列&#xff0c;如果有兩個元素…

C++ array初始化需要雙層大括號

對于array的初始化我們可以使用列表初始化&#xff1a; array<int, 8> test {1,2,3,4,5,6,7,8 };但是當我們不再使用簡單的內置類型array時&#xff1a; array<pair<int, int>, 8> dirs {{-1, -1},{-1, 0},{-1, 1},{0, -1},{0, 1},{1, -1},{1, 0},{1, 1}…

Qt for Android環境配置

最近想寫一個小APP&#xff0c;但是又不想用Android Studio進行開發&#xff0c;想要用C進行開發&#xff0c;聽說Qt可以進行Android開發&#xff0c;就想嘗試一下&#xff0c;結果花了一天時間來配置環境。。。而且發現windows下配置環境更簡單一些&#xff08;我中途還切換到…

UVa-12333:Revenge of Fibonacci 高精度

之前自己仿照紫書上寫了高精度庫&#xff0c;完善了乘法、減法&#xff0c;并且通過了和C高精度庫GMP的對拍測試&#xff0c;并在一些OJ上過了一些高精度的模板題&#xff0c;代碼倉庫地址&#xff1a;https://github.com/Edward-Elric233/BigInt 求解思路 題目的意思是求前1…

vim命令筆記

vim折疊函數&#xff1a;https://www.cnblogs.com/zlcxbb/p/6442092.html Vim錄制宏及使用&#xff1a;https://www.jianshu.com/p/9d999c72a9f3 將vim與系統剪貼板的交互使用&#xff1a;https://zhuanlan.zhihu.com/p/73984381

Educational Codeforces Round 114總結

緒論 https://codeforces.com/contest/1574/ 以前想要打CF&#xff0c;總是覺得沒有時間&#xff0c;要做這個&#xff0c;要做那個&#xff0c;現在時間充裕了一些&#xff0c;想要多打一些CF&#xff0c;但是光打比賽不總結是沒有什么幫助的&#xff0c;這是我從以前的ACM訓…