Jsoncpp的安裝與使用方式
JsonCpp 是一個C++庫,用于解析和生成JSON數(shù)據(jù)。它支持解析JSON文件或字符串到C++對象,以及將C++對象序列化回JSON格式。
安裝Jsoncpp
我們可以輸入以下命令安裝jsoncpp庫。
sudo yum install -y jsoncpp-devel
安裝時默認(rèn)安裝動態(tài)庫。頭文件存儲在 /usr/include/jsoncpp/json 中。
庫文件存儲在 /lib64 中,我們可以簡單查看一下。
Jsoncpp的使用
對于 jsoncpp 我們只需要掌握三個類就可以覆蓋開發(fā)時的絕大多數(shù)場景。
- Json::Value:
- 這是 JsonCpp 中最核心的類,用于表示 JSON 值。Json::Value 可以包含任何 JSON 類型的數(shù)據(jù):對象(一組鍵值對)、數(shù)組、字符串、數(shù)字、布爾值(true/false)、null 值。你可以使用這個類來創(chuàng)建、查詢和修改 JSON 數(shù)據(jù)。
- Json::Reader:
- Json::Reader 類用于解析 JSON 字符串。你可以使用這個類將一個符合 JSON 格式的字符串解析成一個 Json::Value 對象。這個過程稱為 JSON 反序列化。
- Json::Writer:
- Json::Writer 類用于將 Json::Value 對象轉(zhuǎn)換回 JSON 字符串。這個過程稱為 JSON 序列化。Json::Writer 還可以格式化 JSON 數(shù)據(jù),使其以易于閱讀的方式輸出。
Jsoncpp庫中的類定義在命名空間 Json 中 ,在使用時我們需要聲明命名空間。
Json 支持以下類型:
nullValue | 空值 |
intValue | 有符號整數(shù) |
uintValue | 無符號整數(shù) |
realValue | 浮點數(shù) |
stringValue | 字符串 |
booleanValue | 布爾數(shù) |
arrayValue | 數(shù)組 |
objectValue | 鍵值對 |
Value類
Value 類是數(shù)據(jù)的容器,它支持存儲Json中的所有類型。Value為我們提供了各種類型的構(gòu)造函數(shù)。
構(gòu)造函數(shù)
默認(rèn)構(gòu)造函數(shù):
Json::Value value; //創(chuàng)建一個空的value對象
構(gòu)造一個具有特定類型的值:
Json::Value value(1); // 整數(shù) Json::Value value(1.0); // 浮點數(shù) Json::Value value("string"); // 字符串 Json::Value value(true); // 布爾值
構(gòu)造一個數(shù)組或?qū)ο螅?/p>
Json::Value array(Json::arrayValue); // 空數(shù)組 Json::Value object(Json::objectValue);// 空對象
復(fù)制構(gòu)造函數(shù):
Json::Value value1; Json::Value value2(value1); // value2 是 value1 的副本
構(gòu)造一個具有特定值的數(shù)組或?qū)ο螅?/p>
Json::Value array(Json::arrayValue); // 明確指定數(shù)組類型 Json::Value object(Json::objectValue); // 明確指定對象類型
構(gòu)造一個包含初始值的數(shù)組或?qū)ο螅?/p>
Json::Value array(Json::arrayValue, 10); // 創(chuàng)建一個包含10個元素的數(shù)組,每個元素都是null Json::Value object(Json::objectValue, 5); // 創(chuàng)建一個包含5個元素的對象
從另一個 JSON 值構(gòu)造:
Json::Value value1("initial value"); Json::Value value2 = value1; // value2 是 value1 的副本
Jsoncpp也為我們提供了一系列的檢測 Value 中存儲的值。這些接口都很簡單,從命名即可看出它們的作用,在此不過多介紹。
檢測保存的數(shù)據(jù)類型
bool isNull() const; bool isBool() const; bool isInt() const; bool isInt64() const; bool isUInt() const; bool isUInt64() const; bool isIntegral() const; bool isDouble() const; bool isNumeric() const; bool isString() const; bool isArray() const; bool isObject() const;
當(dāng)我們從一個 Json::Value 對象中提取數(shù)據(jù)時,我們需要將它轉(zhuǎn)換為相應(yīng)的實際數(shù)據(jù)類型,同樣Jsoncpp 為我們提供了相應(yīng)的接口。
提取數(shù)據(jù)
// 將 Json::Value 對象轉(zhuǎn)換為 int 類型。 Int asInt() const; // 將 Json::Value 對象轉(zhuǎn)換為 unsigned int 類型。 UInt asUInt() const; // 將 Json::Value 對象轉(zhuǎn)換為 int64_t 類型。 Int64 asInt64() const; // 將 Json::Value 對象轉(zhuǎn)換為 uint64_t 類型。 UInt64 asUInt64() const; // 將 Json::Value 對象轉(zhuǎn)換為最大的整數(shù)類型(long long 類型)。 LargestInt asLargestInt() const; // 將 Json::Value 對象轉(zhuǎn)換為最大的無符號整數(shù)類型(unsigned long long 類型)。 LargestUInt asLargestUInt() const; // 將 Json::Value 對象轉(zhuǎn)換為 std::string 類型。 JSONCPP_STRING asString() const; // 將 Json::Value 對象轉(zhuǎn)換為 float 類型。 float asFloat() const; // 將 Json::Value 對象轉(zhuǎn)換為 double 類型。 double asDouble() const; // 將 Json::Value 對象轉(zhuǎn)換為 bool 類型。 bool asBool() const; // 將 Json::Value 對象轉(zhuǎn)換為 C 風(fēng)格的字符串(const char* 類型)。 const char* asCString() const;
在這些接口中,除了 asCString() 類型不匹配會返回空指針,其他接口在類型不匹配時都會則拋出 Json::TypeError。
這些接口都很簡單,我們可以簡單使用一下。
#include<jsoncpp/json/json.h> #include<iostream> using namespace Json; int main() { Value a(1234); if(a.isInt()) { int b=a.asInt(); std::cout << b << std::endl; } return 0; }
因為 jsoncpp 是一個第三方庫,所以編譯時我們需要使用 -l 指定需要鏈接的庫。
g++ -o test jsontest.cpp -ljsoncpp
可以看到程序按預(yù)期輸出 1234 。
對于Json數(shù)組 Value 同樣有一系列接口。
對json數(shù)組的操作
Json數(shù)組可以存儲Json支持的所有類型,包括數(shù)組。
ArrayIndex size() const;
返回數(shù)組時的大小,即數(shù)組中的元素數(shù)量。
Value& operator[](ArrayIndex index); Value& operator[](int index);
重載的 [] 運算符,用于訪問 Json::Value 對象作為數(shù)組時指定索引的元素。返回 Json::Value 對象的引用,允許修改。
const Value& operator[](ArrayIndex index) const; const Value& operator[](int index) const;
重載的 [] 運算符,用于訪問 Json::Value 對象作為數(shù)組時指定索引的元素。返回 Json::Value 對象的常量引用,不允許修改。
Value get(ArrayIndex index, const Value& defaultValue) const;
使用指定的 index 下標(biāo)訪問 Json::Value 對象中的元素。如果 index 在有效范圍內(nèi),返回對應(yīng)的 Json::Value 對象。如果 index 無效,返回提供的 defaultValue。
Value& append(const Value& value);
向數(shù)組的末尾添加一個新元素,并返回對新元素的引用。
const_iterator begin() const;
返回一個迭代器,指向 Json::Value 對象作為數(shù)組或?qū)ο蟮牡谝粋€元素。這個迭代器是 const_iterator 類型,只能用于讀取元素。
const_iterator end() const;
返回一個迭代器,指向 Json::Value 對象數(shù)組或?qū)ο竽┪驳南乱粋€位置。這個迭代器是 const_iterator 類型,表示迭代結(jié)束的位置。
#include<jsoncpp/json/json.h> #include<iostream> using namespace Json; int main() { Value arr(arrayValue); Value a(1); Value b("hello world"); arr.append(a); arr.append(b); int x=arr[0].asInt(); const char* y=arr[1].asCString(); std::cout << "arr[0]:" << x << std::endl; std::cout << "arr[1]:" << y << std::endl; return 0; }
iterator begin();
返回一個迭代器,指向 Json::Value 對象作為數(shù)組或?qū)ο蟮牡谝粋€元素。這個迭代器是 iterator 類型,允許修改元素。
iterator end();
返回一個迭代器,指向 Json::Value 對象數(shù)組或?qū)ο竽┪驳南乱粋€位置。這個迭代器是 iterator 類型,表示迭代結(jié)束的位置。
我們簡單使用一下:
#include<jsoncpp/json/json.h> #include<iostream> using namespace Json; int main() { Value arr(arrayValue); Value a(1); Value b("hello world"); arr.append(a); arr.append(b); int x=arr[0].asInt(); const char* y=arr[1].asCString(); std::cout << "arr[0]:" << x << std::endl; std::cout << "arr[1]:" << y << std::endl; return 0; }
運行結(jié)果:
對Json對象的操作
JSON 對象由一系列鍵值對組成,其中每個鍵都是一個字符串,與一個值關(guān)聯(lián)。JSON 對象的鍵值對是無序的,這意味著鍵值對的順序可能會在不同的 JSON 對象中有所不同,但它們表示相同的數(shù)據(jù)。同時JSON 對象中的每個鍵都是唯一的,不允許有重復(fù)的鍵。
添加鍵值對:
obj["key1"] = "value1"; // 使用操作符 [] 添加鍵值對 obj["key2"] = 123; // 鍵可以關(guān)聯(lián)不同類型的值
訪問值:
Json::Value value = obj["key1"]; // 獲取鍵 "key1" 對應(yīng)的值
檢查鍵是否存在:
if (obj.isMember("key1")) // 鍵 "key1" 存在
獲取所有鍵的名稱:
Json::Value::Members members = obj.getMemberNames(); for (const auto& key : members) { std::cout << key << std::endl; }
Members是std::vector<std::string>的typedef別名。
修改值:
obj["key1"] = "new value"; // 修改已存在的鍵 "key1" 對應(yīng)的值
刪除鍵值對:
obj.removeMember("key1"); // 刪除鍵 "key1" 及其對應(yīng)的值
檢查 JSON 對象是否為空:
bool isEmpty = obj.empty();
獲取 JSON 對象的大小
Json::ArrayIndex size = obj.size(); // 返回對象中鍵值對的數(shù)量
我們簡單演示一下使用。
#include<jsoncpp/json/json.h> #include<iostream> using namespace Json; int main() { Value obj(Json::objectValue); obj["age"]=18; obj["name"]="張三"; Json::Value::Members members = obj.getMemberNames(); for (const auto& key : members) { std::cout << key << std::endl; } for (const auto &e : members) { std::cout << e << ":" << obj[e] << std::endl; } return 0; }
我們運行一下。
Value也為我們提供了接口將對象序列化。
std::string toStyledString() const;
這個接口序列化出的字符串是帶縮進與換行的,我們簡單演示一下。
#include<jsoncpp/json/json.h> #include<iostream> #include<string> using namespace Json; int main() { Value obj(Json::objectValue); obj["age"]=18; obj["name"]="張三"; std::string s = obj.toStyledString(); std::cout << s << std::endl; return 0; }
運行結(jié)果
FastWriter類
在 JsonCpp 中,F(xiàn)astWriter可以將 Json::Value 對象轉(zhuǎn)換為 JSON 格式的字符串。與StyledStreamWriter 不同,F(xiàn)astWriter 不進行任何美化(不添加空格和縮進),因此通常會產(chǎn)生更緊湊的輸出,但寫入速度更快。在網(wǎng)絡(luò)通信中,我們通常用它將數(shù)據(jù)序列化為單行,便于進行網(wǎng)絡(luò)數(shù)據(jù)的傳輸。
std::string Json::FastWriter::write(const Value& root);
我們只需要掌握這一個接口即可,它會將傳入的對象序列化為單行的字符串。
我們簡單使用一下。
#include<jsoncpp/json/json.h> #include<iostream> #include<string> using namespace Json; int main() { Value obj(Json::objectValue); obj["age"]=18; obj["name"]="張三"; FastWriter writer; std::string s=writer.write(obj); std::cout << s ; return 0; }
運行結(jié)果:
Reader類
有序列化,就有反序列化,在將Json對象進行序列化后,我們可以通過 read 類進行反序列化,
bool Json::Reader::parse(const std::string& document,Value& root, bool collectComments = true);
參數(shù):
- document: json格式字符串
- root: 傳出參數(shù), 存儲了json字符串中解析出的數(shù)據(jù)
- collectComments: 是否保存json字符串中的注釋信息默認(rèn)true
parse有其他重載,但在這里我們不過多介紹。這里我們簡單演示一下parse的使用
#include<jsoncpp/json/json.h> #include<iostream> #include<string> using namespace Json; int main() { Value obj(Json::objectValue); obj["age"]=18; obj["name"]="張三"; FastWriter writer; std::string s=writer.write(obj); std::cout << s ; Reader reader; Value val; reader.parse(s,val); std::cout << val["age"] << std::endl; std::cout << val["name"] << std::endl; return 0; }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++ windows LOG4plus的使用小結(jié)
這篇文章主要介紹了C++ windows LOG4plus的使用小結(jié),本文通過圖文示例代碼相結(jié)合給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05linux根據(jù)pid獲取進程名和獲取進程pid(c語言獲取pid)
status文件,第一行的Name即為進程名,C程序?qū)崿F(xiàn)根據(jù)PID獲取進程名和根據(jù)進程名獲取PID,大家參考使用吧2013-12-12關(guān)于C++中sort()函數(shù)的用法,你搞明白了沒
這篇文章主要介紹了關(guān)于C++中sort()函數(shù)的用法,并通過三種方法介紹了按降序排列的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03