文章目錄
- 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() const | 轉 int 類型(Int 一般是 int 別名 ) |
UInt asUInt() const | 轉 unsigned int 類型 |
double asDouble() const | 轉 double 類型 |
bool asBool() const | 轉 bool 類型 |
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 | 是否為整數類型(int 、uint 等整數相關類型 ) |
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
數組操作通過一系列函數實現,ArrayIndex
是unsigned 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) const | 按 key 取成員值,無則返回 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;
}
關鍵邏輯:
- 先創建
Json::Reader
對象reader
和用于存儲結果的Json::Value
對象root
。 - 調用
reader.parse
傳入 JSON 字符串json_data
和root
,嘗試解析。 - 根據
parse
返回值判斷是否成功,成功則通過root
的[]
運算符 +asxxx
函數(如asString
、asDouble
)訪問數據;失敗可做錯誤處理。
如果要從文件解析 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::StyledWriter
、Json::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"}