簡述C++ nlohmann/json 庫

目錄

JSON概述

nlohmann/json 庫的使用

創建json數組/對象

字符串解析(parse反序列化)

數據訪問

序列化

文件讀寫


JSON概述

JSON(JavaScrip Object Notation)是一種輕量級、跨語言的數據交換格式。它基于 ECMAScript 子集,以獨立于編程語言的文本格式存儲和表示數據,簡潔清晰的結構使其成為理想的數據交換語言,易讀、易寫且便于機器解析生成,能提升網絡傳輸效率 。

Json中主要有兩種數據格式:Json數組和Json對象,并且這兩種格式可以交叉嵌套使用。

Json數組使用 [] 表示,[]里邊是元素,元素和元素之間使用逗號間隔。一個Json數組中支持同時存在多種不同類型的成員,包括:整形、 浮點、 字符串、 布爾類型、 json數組、 json對象、 空值-null。由此可見Json數組比起C/C++數組要靈活很多。

Json對象使用 {} 來描述,每個Json對象中可以存儲若干個元素,每一個元素對應一個鍵值對(key:value 結構),元素和元素之間使用逗號間隔。鍵值必須是字符串,同一對象里,鍵不能重復,否則解析時會出現覆蓋。

在一個Json文件中只能有一個Json數組或者Json對象的根節點,不允許同時存儲多個并列的根節點。

數組為根:體現 有序集合關系 ,數據按位置(索引)排列,適合描述批量、同構 / 異構的列表數據。更關注數據的 “順序” 和 “批量性”,而非單個數據的語義標簽。比如(批量用戶列表場景);

[{"name": "ZY", "age": 20},{"name": "LMM", "age": 20}
]

對象為根:體現鍵值映射關系 ,每個數據有明確的 “語義標簽(鍵名)”,適合描述復雜實體(如用戶信息、配置項),閱讀和維護時能通過鍵名快速理解數據含義。比如(用戶信息場景):

{"name": "ZY","age": 20,"is_student":true,"skills": ["C++", "Linux", "QT"]
}

nlohmann/json 庫的使用

創建json數組/對象

創建數組:通過創建空數組逐步添加元素或直接初始化列表的形式創建。

json arr = { "ZY",20,true,{"C++","Linux","QT"} };json Arr = json::array();
Arr.push_back("ZY");
Arr.push_back(20);
Arr.push_back(true);
Arr.push_back({ "C++","Linux","QT" });

創建對象:通過創建空對象逐步添加鍵值對或直接初始化列表的形式創建。

json obj = { {"name","ZY"},{"age",20},{"is_student",true},{"skills",{"C++","Linux","QT"}} };json Obj;
Obj["name"] = "ZY";
Obj["age"] = 20;
Obj["is_student"] = true;
Obj["skills"] = { "C++","Linux","QT" };

字符串解析(parse反序列化)

std::string json_str = R"({"name": "ZY","age": 20,"is_student":true,"skills": ["C++", "Linux", "QT"]
})";
json json_obj = json::parse(json_str);

把符合 JSON 格式的字符串轉換成?nlohmann::json?類型的對象,也就是 “反序列化” 操作,讓程序能方便地訪問 JSON 里的數據 。?

數據訪問

通過[]訪問或者遍歷,類似c++容器.demo:

std::cout << arr[3][0] << std::endl;
for (const auto& a : arr)
{std::cout << a << std::endl;
}
for (auto it = arr.begin(); it != arr.end(); ++it) {std::cout<< *it << std::endl;
}std::cout << obj["skills"][2] << std::endl;
for (auto it = obj.begin(); it != obj.end(); ++it) {std::string key = it.key();       json value = it.value();          std::cout << "Key: " << key << ", Value: " << value << std::endl;
}for (auto& element : obj.items()) {std::string key = element.key();json value = element.value();std::cout << "Key: " << key << ", Value: " << value << std::endl;
}std::string name = json_obj["name"];
int age = json_obj["age"];
bool is_student = json_obj["is_student"];
std::vector<std::string> skills = json_obj["skills"];
// 輸出結果
std::cout << "Name: " << name << "\n";
std::cout << "Age: " << age << "\n";
std::cout << "Is student: " << (is_student ? "Yes" : "No") << "\n";
std::cout << "Skills: ";
for (const auto& skill : skills) {std::cout << skill << " ";
}
std::cout << std::endl;

序列化

json obj = { {"name","ZY"},{"age",20},{"is_student",true},{"skills",{"C++","Linux","QT"}} };
json Obj;
Obj["name"] = "ZY";
Obj["age"] = 20;
Obj["is_student"] = true;
Obj["skills"] = { "C++","Linux","QT" };std::string str = Obj.dump(2);
std::cout << str << std::endl;

把?nlohmann::json?類型的對象轉換成 JSON 格式的字符串,方便輸出、存儲或者網絡傳輸 。可以理解成 “序列化” 操作,將內存里的 JSON 對象變成能直接用文本形式處理的字符串。dump?可以帶一個整數參數,用于指定縮進的空格數,讓生成的 JSON 字符串更易讀;不傳參數時,生成緊湊的、沒有額外空格的 JSON 字符串。?

?

文件讀寫

// 寫入 JSON 到文件
std::ofstream file("data.json");
file << j2.dump(2);
file.close();// 從文件讀取 JSON
std::ifstream input("data.json");
json j_from_file;
input >> j_from_file;

?

json常用于c++開發中數據處理、通信、配置、調試等環節,nlohmann/json?等庫讓 C++ 處理 JSON 便捷高效,結合場景靈活運用,能提升程序的可維護性、擴展性與跨平臺協作能力。

🌱🌱🌱.

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

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

相關文章

定制開發開源AI智能名片與S2B2C商城小程序的內容分發體系構建:基于“1+N“素材復用模型的創新實踐

摘要&#xff1a;在數字內容爆炸式增長的當下&#xff0c;本文針對內容分發效率低下的行業痛點&#xff0c;提出基于"定制開發開源AI智能名片S2B2C商城小程序"的一體化解決方案。通過構建"1篇長文10條長視頻20條短視頻10個平臺"的素材復用公式&#xff0c;…

c++26新功能—hive容器

一、容器的演進 科學進步的過程一般來說都是從先解決常用的、迫切的問題開始&#xff0c;然后再逐步解決一些少見不迫切的問題&#xff0c;直到最終解決到認知程度內的諸多問題。舉一個網上的例子&#xff0c;以前說咱們無法生產水筆的尖頭上的鋼球&#xff0c;其實這對于國內…

Kafka 源碼剖析:消息存儲與協議實現(二)

四、協議實現機制探秘 4.1 生產者協議 4.1.1 消息發送流程 Producer 在向 Kafka 集群發送消息時&#xff0c;首先會根據分區策略選擇目標分區 。常見的分區策略有輪詢、按消息鍵的哈希值分區以及自定義分區策略 。如果生產者在發送消息時指定了分區號&#xff0c;那么消息就…

Vue.js 與 TypeScript:最佳實踐

1. 引言 Vue.js 是一個漸進式、靈活的 JavaScript 框架&#xff0c;廣泛用于構建用戶界面和單頁應用&#xff08;SPA&#xff09;。而 TypeScript 是 JavaScript 的一個超集&#xff0c;添加了靜態類型和其他高級特性。將兩者結合使用&#xff0c;可以幫助開發者構建更具可維護…

webpack5 css-loader:從基礎到原理

webpack 處理樣式 webpack本身是不能識別樣式資源的&#xff0c;需要借助Loader來幫助webpack解析樣式資源&#xff0c;樣式資源包括但不限于css/less/sass/scss/styl 未使用樣式處理加載器前 運行webpack打包命令 bash npx webpack報錯信息如圖&#xff0c;提示無法識別css…

【GESP】C++三級練習 luogu-B2096 直方圖

GESP C三級練習&#xff0c;一維數組練習&#xff0c;難度★★☆☆☆。 題目題解詳見&#xff1a;【GESP】C三級練習 luogu-B2096 直方圖 | https://www.coderli.com/gesp-3-luogu-b2096/ 【GESP】C三級練習 luogu-B2096 直方圖 | OneCoderGESP C三級練習&#xff0c;一維數組…

【網站內容安全檢測】之2:從網站所有URL頁面中提取所有外部及內部域名信息

還沒寫成Go的&#xff0c;用Python吧&#xff0c;稍微慢一點 依賴內容&#xff08;安裝命令pip install -r requirements.txt) requirements.txt aiohttp beautifulsoup44.12.2 tqdm4.66.1 redis5.2.1 motor3.3.1 pymongo4.6.0 chardet提取域名的程序 domain_extractor.py …

【LLaMA-Factory 實戰系列】四、API 篇 - 部署推理服務與批量調用實戰

【LLaMA-Factory 實戰系列】四、API 篇 - 部署推理服務與批量調用實戰 1. 引言2. 推理后端的選擇與對比3. 部署 API 推理服務3.1 創建 API 配置文件3.2 啟動 API 服務3.3 探索交互式 API 文檔 4. 編寫 Python 腳本進行批量調用4.1 準備工作4.2 批量調用腳本4.3 運行腳本并查看結…

C++工廠模式的作用(工廠方法、Factory Method、Factory Pattern)

文章目錄 代碼示例工廠的作用1. 對象創建的封裝 &#x1f3ed;2. 解耦客戶端和具體類 &#x1f517;3. 統一的創建入口 &#x1f6aa;4. 隱藏實現細節 &#x1f3ad; 在這個項目中的具體體現總結 代碼示例 https://gitee.com/arnold_s/my-learning-test/tree/master/20250610_…

9-C#修改任務管理的名稱

C#修改任務管理的名稱

Fisco Bcos學習 - 搭建第一個區塊鏈網絡

文章目錄 一、前言二、環境準備三、安裝依賴在 macOS 上安裝依賴在 Ubuntu 上安裝依賴在 CentOS 上安裝依賴 四、創建操作目錄并下載安裝腳本五、搭建單群組 4 節點聯盟鏈六、啟動 FISCO BCOS 鏈七、檢查進程八、檢查日志輸出 在數字化時代&#xff0c;區塊鏈技術正逐漸成為推動…

可視化圖解算法53:表達式求值

牛客網 面試筆試 TOP 101 1. 題目 描述 請寫一個整數計算器&#xff0c;支持加減乘三種運算和括號。 數據范圍&#xff1a;0≤∣s∣≤100&#xff0c;保證計算結果始終在整型范圍內 要求&#xff1a;空間復雜度&#xff1a; O(n)&#xff0c;時間復雜度 O(n) 示例1 輸入…

小白成長之路-Nginx配置(二)

文章目錄 一、localtion配置1.匹配規則2.匹配優先級3.配置案例 二、rewrite1、 語法2、 可寫入字段3 配置案例4 if 指令5.sutoindex6. nginx配置中的常用變量 三、配置Nginx狀態統計1.下載vts模塊2.編譯nginx 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參…

Qt的第一個程序

Qt的第一個程序 1.hello world2.使用圖形化拖拽方式3.使用C代碼的方式3.1.頭文件3.2.setText3.3.對象樹 4.設計MyLabel5.亂碼問題 &#x1f31f;&#x1f31f;hello&#xff0c;各位讀者大大們你們好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列專欄&#xff…

圖書數據接口

基本說明&#xff1a; 接口地址&#xff1a;http://data.isbn.work/openApi/getInfoByIsbn?isbn{isbn}&appKey{appkey}返回格式&#xff1a;json請求方式&#xff1a;get請求示例&#xff1a;http://data.isbn.work/openApi/getInfoByIsbn?isbn9787513159074&appKey…

MongoDB原理

目錄 一、概念 二、架構 2.1 邏輯結構 2.2 數據模型 2.3 存儲引擎&#xff1a;WiredTiger 三、事務 一、概念 MongoDB是文檔數據庫&#xff0c;基本存儲單元是 文檔&#xff08;Document&#xff09;&#xff0c;以BSON格式&#xff08;一種類json的二進制形式&#xff…

《解碼音頻:從基礎到未來的聽覺探索》

音頻&#xff1a;開啟聲音世界的大門 在生活的每一個角落&#xff0c;音頻如影隨形&#xff0c;編織出豐富多彩的聽覺體驗。清晨&#xff0c;第一縷陽光尚未完全照進房間&#xff0c;手機里溫柔的鬧鐘鈴聲&#xff0c;將我們從睡夢中輕輕喚醒&#xff0c;開啟活力滿滿的一天。通…

web安全之h2注入系統學習

起初是在N1 Junior 2025 上面碰到一題&#xff0c;考點是h2的sql注入。由于之前沒有見過&#xff0c;趁此機會系統學習一番 實驗代碼 public class H2Inject {public static void main(String[] args) throws Exception{JdbcDataSource dataSource new JdbcDataSource();dataS…

AWS認證系列:考點解析 - cloud trail,cloud watch,aws config

&#x1f3af;一句話總覽&#xff1a; 服務名類比/角色主要功能CloudTrail監控攝像頭錄像回放記錄“誰在什么時候做了什么操作”CloudWatch護士測體溫 護士喊醫生實時監控系統狀態&#xff0c;并能報警/自動應對AWS Config保安巡邏 記錄資產變更歷史記錄 AWS 資源的“配置狀…

Java八股文——數據結構「數據結構篇」

了解哪些數據結構&#xff1f; 面試官您好&#xff0c;我了解并使用過多種數據結構。在我的理解中&#xff0c;數據結構可以分為幾個大的類別&#xff0c;每一類都有其獨特的優勢和適用場景。 1. 線性結構 (Linear Structures) 這類結構的特點是數據元素之間存在一對一的線性…