C++第三方庫(kù)jsoncpp超詳細(xì)講解
1.介紹
json
是一種數(shù)據(jù)交換格式,采用完全獨(dú)立于編程語(yǔ)言的文本格式來(lái)存儲(chǔ)和表示數(shù)據(jù)json
數(shù)據(jù)類型:對(duì)象、數(shù)組、字符串、數(shù)字- 對(duì)象:使用
{}
括起來(lái)的表示一個(gè)對(duì)象 - 數(shù)組:使用
[]
括起來(lái)的表示一個(gè)數(shù)組 - 字符串:使用
""
括起來(lái)的表示一個(gè)字符串 - 數(shù)字:包括整形和浮點(diǎn)型,直接使用
- 對(duì)象:使用
2.jsoncpp
jsoncpp
庫(kù)用于實(shí)現(xiàn)json
格式的序列化和反序列化,完成將多個(gè)數(shù)據(jù)對(duì)象組織成為格式字符串解析得到多個(gè)數(shù)據(jù)對(duì)象的功能
主要借助三個(gè)類以及其對(duì)應(yīng)的少量成員函數(shù)完成:
// Json數(shù)據(jù)對(duì)象類 -> 用于進(jìn)行中間數(shù)據(jù)存儲(chǔ) class Json::Value { // Value重載了[]和=,因此所有的賦值和獲取數(shù)據(jù)都可以通過(guò)[]實(shí)現(xiàn) Value &operator=(const Value &other); // 簡(jiǎn)單的方式完成 val["姓名"] = "SnowK"; Value& operator[](const std::string& key); Value& operator[](const char* key); // 移除元素 Value removeMember(const char* key); // val["成績(jī)"][0] const Value& operator[](ArrayIndex index) const; // 添加數(shù)組元素val["成績(jī)"].append(88); Value& append(const Value& value); // 獲取數(shù)組元素個(gè)數(shù) val["成績(jī)"].size(); ArrayIndex size() const; // 轉(zhuǎn)string string name = val["name"].asString(); std::string asString() const; // 轉(zhuǎn)char* char *name = val["name"].asCString(); const char* asCString() const; // 轉(zhuǎn)int int age = val["age"].asInt(); int asInt() const; // 轉(zhuǎn)float float asFloat() const; // 轉(zhuǎn) bool bool asBool() const; }; //json序列化類,低版本用這個(gè)更簡(jiǎn)單 class JSON_API Writer { virtual std::string write(const Value& root) = 0; } class JSON_API FastWriter : public Writer { virtual std::string write(const Value& root); } class JSON_API StyledWriter : public Writer { virtual std::string write(const Value& root); } //json 序列化類,高版本推薦,如果用低版本的接口可能會(huì)有警告 class JSON_API StreamWriter { virtual int write(Value const& root, std::ostream* sout) = 0; } class JSON_API StreamWriterBuilder : public StreamWriter::Factory { virtual StreamWriter* newStreamWriter() const; } // json反序列化類,低版本用起來(lái)更簡(jiǎn)單 class JSON_API Reader { bool parse(const std::string& document, Value& root, bool collectComments = true); } // json反序列化類,高版本更推薦 class JSON_API CharReader { virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs) = 0; } class JSON_API CharReaderBuilder : public CharReader::Factory { virtual CharReader* newCharReader() const; }
3.使用
1.main.cc
int main() { char name[] = "SnowK"; int age = 18; float score[3] = {100, 99, 98}; Json::Value stu; stu["Name"] = name; stu["Age"] = age; stu["Score"].append(score[0]); stu["Score"].append(score[1]); stu["Score"].append(score[2]); std::string str; if(Serialize(stu, str) == false) { return -1; } std::cout << str << std::endl; std::cout << "-------------------------------" << std::endl; Json::Value val; if(UnSerialize(str, val) == false) { return -1; } std::cout << val["Name"].asString() << std::endl; std::cout << val["Age"].asInt() << std::endl; for (int i = 0; i < val["Score"].size(); i++) { std::cout << val["Score"][i].asInt() << std::endl; } return 0; }
2.序列化
bool Serialize(const Json::Value &val, std::string &dest) { // 由Json::StreamWriterBuilder生產(chǎn)出Json::StreamWriter Json::StreamWriterBuilder swb; std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter()); // 通過(guò)Json::StreamWrite的write()進(jìn)行序列化 std::stringstream ss; if (sw->write(val, &ss) != 0) { std::cout << "Json序列化失敗" << std::endl; return false; } dest = ss.str(); return true; }
3.反序列化
bool UnSerialize(const std::string &src, Json::Value &val) { Json::CharReaderBuilder crb; std::unique_ptr<Json::CharReader> cr(crb.newCharReader()); std::string err; if (cr->parse(src.c_str(), src.c_str() + src.size(), &val, &err) == false) { std::cout << "json反序列化失敗: " << err << std::endl; return false; } return true; }
總結(jié)
到此這篇關(guān)于C++第三方庫(kù)jsoncpp的文章就介紹到這了,更多相關(guān)C++第三方庫(kù)jsoncpp內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
快來(lái)領(lǐng)取!你想要的C++/C語(yǔ)言優(yōu)秀書(shū)籍
如何選擇合適的C++/C語(yǔ)言書(shū)籍,是不是已經(jīng)眼花繚亂,不知道該選擇哪本好了呢?今天我來(lái)為大家分享兩本不可錯(cuò)過(guò)的優(yōu)秀書(shū)籍2017-09-09C++實(shí)現(xiàn)二叉樹(shù)的堂兄弟節(jié)點(diǎn)查詢
C++實(shí)現(xiàn)二叉樹(shù)的堂兄弟節(jié)點(diǎn)查詢,是指在二叉樹(shù)中,找到兩個(gè)節(jié)點(diǎn)深度相同但父節(jié)點(diǎn)不同的節(jié)點(diǎn),即為堂兄弟節(jié)點(diǎn)。實(shí)現(xiàn)這一功能可以通過(guò)遍歷二叉樹(shù)并記錄節(jié)點(diǎn)深度和父節(jié)點(diǎn)來(lái)實(shí)現(xiàn)2023-04-04基于OpenCV讀取攝像頭實(shí)現(xiàn)單個(gè)人臉驗(yàn)證MFC程序
這篇文章主要為大家詳細(xì)介紹了基于OpenCV讀取攝像頭實(shí)現(xiàn)單個(gè)人臉驗(yàn)證MFC程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08解析C++中不能重載為友元函數(shù)的四個(gè)運(yùn)算符
以下是對(duì)C++中不能重載為友元函數(shù)的四個(gè)運(yùn)算符進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-07-07C語(yǔ)言實(shí)現(xiàn)學(xué)生打卡系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生打卡系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12新舊MFC版本實(shí)現(xiàn)CEdit透明的2種方法的實(shí)例代碼
新舊MFC版本實(shí)現(xiàn)CEdit透明的2種方法的實(shí)例代碼,需要的朋友可以參考一下2013-03-03北郵計(jì)算機(jī)考研復(fù)試題的C語(yǔ)言解答精選
這篇文章主要介紹了北郵計(jì)算機(jī)考研復(fù)試題目的C語(yǔ)言解答精選,選自2012年的一些基礎(chǔ)的上機(jī)題目,需要的朋友可以參考下2015-08-08vsCode配置import@路徑提示的實(shí)現(xiàn)步驟
在導(dǎo)入文件設(shè)置路徑的時(shí)候方便了很多,本文主要介紹了vsCode配置import@路徑提示的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08