JsonCpp的核心類及核心函數使用匯總

文章目錄

  • JsonCpp的核心類及核心函數使用匯總
    • 一、前言
    • 二、JsonCpp 核心類介紹
    • 三、`Value` 類函數解析
      • 1. 值獲取函數(`asxxx` 系列 )
      • 2. 值類型判斷函數(`isxxx` 系列 )
      • 3. 數組操作函數
      • 4. 對象操作函數
      • 5. 運算符重載
      • 6. 迭代器
      • 7. JSON 轉化
    • 四、Json::Reader 和 Json::Writer 類
      • 1. Json::Reader 類:反序列化 - 解析函數
        • (一)核心作用
        • (二)`parse` 函數重載說明
        • (三)使用示例
      • 3.Json::Writer 類:序列化 - 寫入
        • (一)核心作用
        • (二)常用子類及特點
          • 1. `Json::StyledWriter`
          • 2. `Json::FastWriter`
        • (三)使用示例(結合讀寫 )

JsonCpp的核心類及核心函數使用匯總

一、前言

在 C++ 開發中,處理 JSON 數據是常見需求,JsonCpp 是個實用的 C++ JSON 解析庫。本文總結 JsonCpp 中常見的核心類和函數的使用,幫助掌握 JSON 數據處理。

二、JsonCpp 核心類介紹

說明
Json::Value類型支持類,可解析所有 JSON 支持類型(bool、字符串、浮點數、對象、數組等 );支持用 isxxx 判斷類型、asxxx 轉換類型,能按 JSON 字段格式提取值(如 asString 取字符串節點值 )
Json::Reader可解析文件、文件流、字符串內存,結果存入 Json::Value;支持用 Features 定義 JSON 嚴格等級,影響解析失敗時函數返回邏輯
Json::Writer基類,用于將數據轉為字符串流(內存 )并可寫入文件;需用實現子類(如 Json::FastWriter 壓縮 JSON 后寫入,Json::StyledWriter 按自定義格式輸出 )

三、Value 類函數解析

1. 值獲取函數(asxxx 系列 )

asxxx 函數用于類型轉換,前提是 Value 存儲對應類型數據,否則可能出問題,建議先用 isxxx 判斷。示例:

#include <json/json.h>
#include <iostream>
using namespace std;int main() {Json::Value val;val = "Hello JsonCpp";if (val.isString()) {string str = val.asString(); cout << "字符串值:" << str << endl;}val = 123;if (val.isInt()) {int num = val.asInt(); cout << "整數值:" << num << endl;}return 0;
}

常用 asxxx 函數:

函數功能
const char* asCString() const獲取 C 風格字符串
string asString() const轉成 std::string
Int asInt() constint 類型(Int 一般是 int 別名 )
UInt asUInt() constunsigned int 類型
double asDouble() constdouble 類型
bool asBool() constbool 類型

2. 值類型判斷函數(isxxx 系列 )

  • 用于判斷 Value 存儲數據類型,精準操作 JSON 數據關鍵。函數及功能:
函數功能
bool isNull() const是否為 null 類型
bool isBool() const是否為 bool 類型
bool isInt() const是否為 int 類型
bool isInt64() const是否為 int64_t 類型
bool isUInt() const是否為 unsigned int 類型
bool isUInt64() const是否為 uint64_t 類型
bool isIntegral() const是否為整數類型(intuint 等整數相關類型 )
bool isDouble() const是否為 double 類型
bool isNumeric() const是否為數值類型(整數、浮點數 )
bool isString() const是否為字符串類型
bool isArray() const是否為數組類型(JSON 數組 []
bool isObject() const是否為對象類型(JSON 對象 {}
  • 示例:
Json::Value val;
val = Json::arrayValue; 
if (val.isArray()) {cout << "是數組類型" << endl;
}
val = Json::objectValue;
if (val.isObject()) {cout << "是對象類型" << endl;
}

3. 數組操作函數

  • Json::Value 數組操作通過一系列函數實現,ArrayIndexunsigned int 類型,代表數組索引。
函數功能
Value get(ArrayIndex index, const Value& defaultValue) const按索引 index 取數組元素,無則返回 defaultValue
bool isvalidIndex(ArrayIndex index) const判斷索引 index 是否有效
Value& append(Value& value)添加元素到數組末尾
bool insert(ArrayIndex index, const Value& newValue)在索引 index 處插入元素
bool removeIndex(ArrayIndex index, Value* removed)刪除索引 index 元素,removed 存刪除元素
bool empty() const判斷數組是否為空(對象為空或 null 也返回 true
void clear()清空數組元素(對象則刪除所有成員 )
void resid(ArrayIndex newSize)調整數組大小到 newSize
  • 示例:
Json::Value arr(Json::arrayValue);
arr.append("元素1");
arr.append(123);
// 遍歷數組
for (Json::ArrayIndex i = 0; i < arr.size(); ++i) {cout << "數組元素:" << arr[i] << endl;
}
// 插入元素
arr.insert(1, "插入元素");
// 刪除元素
Json::Value removed;
arr.removeIndex(2, &removed);
cout << "刪除元素:" << removed << endl;

4. 對象操作函數

  • 處理 JSON 對象(鍵值對形式 ),Members 一般是 vector<string> 類型,存對象成員名。
函數功能
Members getMemberNames() const獲取對象所有鍵名,返回 vector<string>
bool isMember(const char* key) const判斷是否有 key 對應的成員
void removeMember(const char* key)刪除 key 對應的成員
Value get(const char* key, const Value& defaultValue) constkey 取成員值,無則返回 defaultValue

示例:

Json::Value obj(Json::objectValue);
obj["name"] = "JsonCpp";
obj["version"] = 1.0;
// 獲取成員名
Json::Value::Members members = obj.getMemberNames();
for (const auto& member : members) {cout << "成員名:" << member << ",值:" << obj[member] << endl;
}
// 判斷成員
if (obj.isMember("name")) {cout << "存在 name 成員" << endl;
}
// 刪除成員
obj.removeMember("version");

5. 運算符重載

Json::Value 重載 [] 運算符,方便像數組或對象一樣訪問元素:

  • 數組訪問:Value& operator[](ArrayIndex index); ,按索引操作數組元素。
  • 對象訪問:Value& operator[](const char* key); ,按鍵操作對象成員。

示例:

Json::Value root;
root["array"][0] = "數組元素"; 
root["object"]["key"] = "對象值"; 
cout << "數組元素:" << root["array"][0] << endl;
cout << "對象值:" << root["object"]["key"] << endl;

6. 迭代器

遍歷 Json::Value (數組或對象 ),分常量迭代器(只讀 )和普通迭代器(可修改 )。

函數功能
const_iterator begin() const常量迭代器起始,只讀
const_iterator end() const常量迭代器結束
iterator begin()普通迭代器起始,可修改
iterator end()普通迭代器結束

示例:

Json::Value arr(Json::arrayValue);
arr.append("元素1");
arr.append("元素2");
// 常量迭代器遍歷(只讀)
for (Json::Value::const_iterator it = arr.begin(); it != arr.end(); ++it) {cout << "常量遍歷:" << *it << endl;
}
// 普通迭代器遍歷(可修改)
for (Json::Value::iterator it = arr.begin(); it != arr.end(); ++it) {*it = "修改后_" + it->asString(); cout << "修改遍歷:" << *it << endl;
}

7. JSON 轉化

Json::Value 可轉成字符串,string Value::toStyledString() const 生成帶縮進格式化字符串,方便查看;若要無格式化或自定義輸出,用 Json::Writer 子類(如 FastWriter 緊湊格式)。示例:

Json::Value val;
val["name"] = "Test";
val["age"] = 20;
string styledStr = val.toStyledString(); 
cout << "格式化字符串:\n" << styledStr << endl;Json::FastWriter fastWriter;
string fastStr = fastWriter.write(val); 
cout << "快速輸出字符串:" << fastStr << endl;

四、Json::Reader 和 Json::Writer 類

在 JsonCpp 庫里,Json::Reader 負責把 JSON 格式的文本數據解析成 Json::Value 對象(反序列化),Json::Writer 及其子類則用于把 Json::Value 對象轉換成 JSON 格式的字符串(序列化 )。

1. Json::Reader 類:反序列化 - 解析函數

(一)核心作用

把 JSON 格式的字符串、文件流等數據,解析成 Json::Value 類型的對象,讓程序能像操作普通數據結構(對象、數組等 )一樣處理 JSON 內容。

(二)parse 函數重載說明

Json::Reader 提供了 3 個常用的 parse 重載函數,適配不同輸入場景:

// 1. 解析 std::string 類型的 JSON 文本
bool parse(const std::string& document, Value& root, bool collectComments = true);  // 2. 解析字符數組形式的 JSON 文本(beginDoc 起始、endDoc 結束 )
bool parse(const char* beginDoc, const char* endDoc, Value& root, bool collectComments = true); // 3. 解析輸入流(如文件流 std::ifstream )里的 JSON 內容
bool parse(Istream& is, Value& root, bool collectComments = true);  
  • 參數說明
    • document / beginDoc+endDoc / is:待解析的 JSON 數據源,分別對應字符串、字符數組范圍、輸入流。
    • root:解析結果會存儲到這個 Json::Value 對象里,后續通過它訪問 JSON 數據。
    • collectComments:是否收集 JSON 里的注釋,默認 true 。一般場景不用刻意關注,保持默認即可;若要嚴格忽略注釋提升解析效率,可設為 false
  • 返回值bool 類型,true 表示解析成功,false 表示解析失敗(如 JSON 格式錯誤 )。
(三)使用示例

假設我們有一段 JSON 格式的字符串,想解析它:

#include <json/json.h>
#include <iostream>
#include <string>
using namespace std;int main() {// 模擬從文件/網絡獲取的 JSON 字符串string json_data = "{\"name\":\"JsonCpp\",\"version\":1.0,\"features\":[\"easy\",\"powerful\"]}";  Json::Reader reader; Json::Value root;   // 調用 parse 解析,結果存入 rootbool parseResult = reader.parse(json_data, root);  if (parseResult) {// 解析成功,訪問 root 里的數據cout << "name: " << root["name"].asString() << endl;cout << "version: " << root["version"].asDouble() << endl;// 遍歷數組const Json::Value& features = root["features"];for (Json::ArrayIndex i = 0; i < features.size(); ++i) {cout << "feature " << i << ": " << features[i].asString() << endl;}} else {// 解析失敗,可打印錯誤信息(需額外處理,JsonCpp 可獲取錯誤詳情 )cerr << "JSON 解析失敗!" << endl;}return 0;
}

關鍵邏輯

  1. 先創建 Json::Reader 對象 reader 和用于存儲結果的 Json::Value 對象 root
  2. 調用 reader.parse 傳入 JSON 字符串 json_dataroot ,嘗試解析。
  3. 根據 parse 返回值判斷是否成功,成功則通過 root[] 運算符 + asxxx 函數(如 asStringasDouble )訪問數據;失敗可做錯誤處理。

如果要從文件解析 JSON,示例如下(基于第 3 個 parse 重載 ):

#include <json/json.h>
#include <fstream>
#include <iostream>
using namespace std;int main() {ifstream ifs("test.json"); if (!ifs.is_open()) {cerr << "無法打開文件 test.json" << endl;return -1;}Json::Reader reader;Json::Value root;// 解析文件流bool parseResult = reader.parse(ifs, root);  ifs.close();if (parseResult) {// 成功解析,處理 root 數據...cout << "解析文件內容成功,name: " << root["name"].asString() << endl;} else {cerr << "解析文件 JSON 失敗!" << endl;}return 0;
}

這里利用 std::ifstream 打開文件,把文件流傳給 reader.parse ,實現從文件解析 JSON 。

3.Json::Writer 類:序列化 - 寫入

(一)核心作用

Json::Writer 是抽象基類,本身不能直接用,需用它的子類(如 Json::StyledWriterJson::FastWriter ),把 Json::Value 對象轉換成 JSON 格式的字符串,用于輸出到日志、網絡、文件等。

(二)常用子類及特點
1. Json::StyledWriter
  • 功能:生成格式化、帶縮進的 JSON 字符串,可讀性強,適合調試、日志打印等場景。
  • 示例代碼
Json::Value root;
root["name"] = "StyledWriter";
root["score"] = 95;Json::StyledWriter styled_writer;
// 調用 write 生成格式化 JSON 字符串
string styledJson = styled_writer.write(root);  cout << "StyledWriter 輸出:\n" << styledJson << endl;

輸出效果

{"name": "StyledWriter","score": 95
}

縮進和換行讓 JSON 結構清晰,方便人看。

2. Json::FastWriter
  • 功能:生成緊湊、無縮進的 JSON 字符串,體積小,適合網絡傳輸、存儲到文件(追求小體積 )等場景。
  • 示例代碼
Json::Value root;
root["name"] = "FastWriter";
root["score"] = 95;Json::FastWriter fast_writer;
// 調用 write 生成緊湊 JSON 字符串
string fastJson = fast_writer.write(root);  cout << "FastWriter 輸出:\n" << fastJson << endl;

輸出效果

{"name":"FastWriter","score":95}

去掉了縮進和多余空格,字符串更短小。

(三)使用示例(結合讀寫 )

完整演示“解析 JSON 字符串 → 操作數據 → 重新序列化為 JSON 字符串”流程:

#include <json/json.h>
#include <iostream>
#include <string>
using namespace std;int main() {// 1. 準備 JSON 字符串string jsonStr = "{\"name\":\"Original\",\"age\":20}";// 2. 反序列化:用 Json::Reader 解析Json::Reader reader;Json::Value root;reader.parse(jsonStr, root);// 3. 操作 JSON 數據(修改、新增 )root["name"] = "Modified";  root["gender"] = "Male";  // 4. 序列化:用不同 Writer 輸出// 4.1 StyledWriter 輸出格式化結果Json::StyledWriter styledWriter;string styledResult = styledWriter.write(root);cout << "StyledWriter 結果:\n" << styledResult << endl;// 4.2 FastWriter 輸出緊湊結果Json::FastWriter fastWriter;string fastResult = fastWriter.write(root);cout << "FastWriter 結果:\n" << fastResult << endl;return 0;
}

輸出結果

StyledWriter 結果:
{"age": 20,"gender": "Male","name": "Modified"
}
FastWriter 結果:
{"age":20,"gender":"Male","name":"Modified"}

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

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

相關文章

Qt寫入excel

1.tableView導出到excel 點擊導出函數按鈕、發送sendMessage信號&#xff08;信號名稱&#xff0c;對象&#xff0c;數據&#xff09; void HydroelectricPowerPluginImpl::exportTableViewSelectedRows(QTableView* tableView, QWidget* parent) {if (!tableView || !tableVie…

OSCP - Proving Grounds - DC - 1

主要知識點 drupal 7 RCEfind SUID提權 具體步驟 nmap起手,80端口比較有意思&#xff0c;安裝了 Drupal 7 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-17 14:23 UTC Nmap scan report for 192.168.57.193 Host is up (0.00087s latency). Not shown: 65531 cl…

仿小紅書交流社區(微服務架構)

文章目錄 framework - 平臺基礎設施starter - jacksoncommonexceptionresponseutil starter - content 全局上下文distributed - id - generate - 分布式 IdSnowflake - 基于雪花算法生成 IdSegment - 基于分段式生成 Id OSS - 對象存儲KV - 短文本存儲筆記評論 user - 用戶服務…

大模型開源技術解析 4.5 的系列開源技術解析:從模型矩陣到產業賦能的全棧突破

提示&#xff1a;本篇文章 1300 字&#xff0c;閱讀時間&#xff1a;5分鐘。 前言 6 月 30 日&#xff0c;百度正式開源文心大模型 4.5 系列&#xff0c;這一動作不僅兌現了 2 月發布會上的技術承諾&#xff0c;更以 10 款全維度模型矩陣刷新了國內開源模型的技術邊界。從學術…

[6-02-01].第05節:配置文件 - YAML配置文件語法

SpringBoot學習大綱 一、YAML語法 1.1.概述&#xff1a; 1.YAML是一種數據序列化格式&#xff1b;2.它是以數據為中心3.容易閱讀&#xff0c;容易與腳本語言交互,如下圖所示&#xff1a; 1.2.基本語法 1.key: value&#xff1a;kv之間有空格2.使用縮進表示層級關系3.縮進時…

FPGA學習

一、module : 定義&#xff1a; 是構建數字系統的基本單元&#xff0c;用于封裝電路的結構和行為。它可以表示從簡單的邏輯門到復雜的處理器等任何硬件組件。 1. module 的基本定義 module 模塊名 (端口列表);// 端口聲明input [位寬] 輸入端口1;output [位寬] 輸出端口1;ino…

26-計組-存儲器與Cache機制

一、存儲器與局部性原理 1. 局部性原理 基礎概念&#xff1a; 時間局部性&#xff1a;一個存儲單元被訪問后&#xff0c;短時間內可能再次被訪問&#xff08;例如循環變量&#xff09;。空間局部性&#xff1a;一個存儲單元被訪問后&#xff0c;其附近單元可能在短時間內被訪…

I/O 線程 7.3

前言 以下&#xff1a; 概述 1.基礎 2.代碼演示 3.練習 4.分析題 1.基礎 一、線程基礎概念 并發執行原理 通過時間片輪轉實現多任務"并行"效果 實際為CPU快速切換執行不同線程 線程 vs 進程 線程共享進程地址空間&#xff0c;切換開銷更小 進程擁有獨立資源&am…

MySQL JSON數據類型完全指南:從版本演進到企業實踐的深度對話

&#x1f4ca; MySQL JSON數據類型完全指南&#xff1a;從版本演進到企業實踐的深度對話 在當今數據驅動的時代&#xff0c;MySQL作為最受歡迎的關系型數據庫之一&#xff0c;不斷演進以滿足現代應用的需求。JSON數據類型的引入&#xff0c;讓MySQL在保持關系型數據庫優勢的同時…

BI × 餐飲行業 | 以數據應用重塑全鏈路業務增長路徑

在競爭激烈的餐飲行業中&#xff0c;數據已成為企業保持競爭力的關鍵資產。通過深入分析顧客數據&#xff0c;餐飲企業能夠洞察消費者的需求和偏好&#xff0c;從而提供更加精準和個性化的服務。此外&#xff0c;利用數據優化業務管理&#xff0c;降低成本&#xff0c;并提高運…

【學習線路】機器學習線路概述與內容關鍵點說明

文章目錄 零、機器學習的企業價值一、基礎概念1. 機器學習定義2. 學習類型3. 學習范式 二、核心算法與技術1. 監督學習2. 無監督學習3. 模型評估與優化 三、深度學習與神經網絡1. 神經網絡基礎2. 深度學習框架3. 應用場景 四、工具與實踐1. 數據處理2. 模型部署3. 機器學習的生…

Linux 命令:cp

Linux cp 命令詳細教程 cp 是 Linux 系統中最常用的命令之一&#xff0c;用于復制文件或目錄。它可以將源文件/目錄復制到指定的目標位置&#xff0c;支持批量復制、強制覆蓋、保留文件屬性等功能。下面詳細介紹其用法。資料已經分類整理好&#xff1a;https://pan.quark.cn/s…

java分頁插件| MyBatis-Plus分頁 vs PageHelper分頁:全面對比與最佳實踐

MyBatis-Plus分頁 vs PageHelper分頁&#xff1a;全面對比與最佳實踐 一、分頁技術概述 在Java持久層框架中&#xff0c;分頁是高頻使用的功能。主流方案有&#xff1a; MyBatis-Plus分頁&#xff1a;MyBatis增強工具的內置分頁方案PageHelper分頁&#xff1a;獨立的MyBatis…

PROFINET轉MODBUS TCP網關在機械臂通信操作中的應用研究

在特定的汽車零部件生產工廠焊接生產線上&#xff0c;機械臂被應用于焊接作業&#xff0c;其控制體系基于Profinet協議。同時&#xff0c;工廠的自動化控制體系以西門子S7-1200PLC為核心&#xff0c;通過ModbusTCP協議實現數據交換。為實現焊接過程的自動化控制以及生產數據的實…

Mac中如何Chrome禁用更新[update chflags macos]

寫在前面 在 macOS 系統中&#xff0c;系統更新提示的小紅點常常讓人不勝其擾。 尤其是當你希望保持現有系統的穩定性&#xff0c;或因兼容性問題暫不想升級時&#xff0c;這個小紅點就像一個頑固的提醒。 - windowsMac版直接刪除更新程序, 有效 cd ~/Library/Google/Googl…

LoRA使用-多個LoRA

LoRA的風格分類 不用去記它有什么很特別的風格&#xff0c;簡單來說基礎模型就像一個全能畫手&#xff0c;什么都能畫&#xff0c;而LoRA是在某個風格中經過特訓的它的一個分身。使得它更精通該風格。 關于LoR風格分類&#xff1a;提示詞撰寫公式 Checkpoint&LoRA對比 訓…

牛客刷題 — 【排序】[NOIP2012] 國王的游戲(高精度結構體排序)

1.題面&#xff1a;傳送門 2. 思路&#xff1a; 相鄰的兩個大臣的先后順序只會互相影響&#xff0c;并不會影響其他人的金幣數。 假設前 i-1 個人左手上的數乘積為 s 。 ① 若 A 大臣排在B 大臣的前面&#xff0c;則&#xff1a; s 此時的金幣數最大值為 。 ② 若B大臣排…

grpc 和限流Sentinel

基于gRPC的微服務通信模塊技術方案書 1. 總體架構設計 #mermaid-svg-TiN9cudEfW5mCWHm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TiN9cudEfW5mCWHm .error-icon{fill:#552222;}#mermaid-svg-TiN9cudEfW5mCWHm…

經典灰狼算法+編碼器+雙向長短期記憶神經網絡,GWO-Transformer-BiLSTM多變量回歸預測,作者:機器學習之心!

經典灰狼算法編碼器雙向長短期記憶神經網絡&#xff0c;GWO-Transformer-BiLSTM多變量回歸預測&#xff0c;作者&#xff1a;機器學習之心&#xff01; 目錄 經典灰狼算法編碼器雙向長短期記憶神經網絡&#xff0c;GWO-Transformer-BiLSTM多變量回歸預測&#xff0c;作者&#…

VGG Image Annotator (VIA):一款免費的數據標注軟件介紹與使用

VGG Image Annotator (VIA)&#xff1a;一款免費的數據標注軟件介紹與使用 在計算機視覺領域&#xff0c;數據標注是訓練機器學習模型的基礎步驟之一&#xff0c;而標注工具的選擇直接影響標注的效率和準確性。眾多標注工具中&#xff0c;VGG Image Annotator (VIA) 是一個開源…