C++第三方庫jsoncpp超詳細講解
更新時間:2024年10月15日 11:01:15 作者:DieSnowK
這篇文章主要介紹了C++第三方庫jsoncpp的相關資料,JSONcpp是一個在C++中用于處理JSON數據的庫,支持JSON格式的序列化和反序列化,通過JSONcpp,可以輕松地將數據對象組織成JSON格式的字符串,需要的朋友可以參考下
1.介紹
json
是一種數據交換格式,采用完全獨立于編程語言的文本格式來存儲和表示數據json
數據類型:對象、數組、字符串、數字- 對象:使用
{}
括起來的表示一個對象 - 數組:使用
[]
括起來的表示一個數組 - 字符串:使用
""
括起來的表示一個字符串 - 數字:包括整形和浮點型,直接使用
- 對象:使用
2.jsoncpp
jsoncpp
庫用于實現json
格式的序列化和反序列化,完成將多個數據對象組織成為格式字符串解析得到多個數據對象的功能
主要借助三個類以及其對應的少量成員函數完成:
// Json數據對象類 -> 用于進行中間數據存儲 class Json::Value { // Value重載了[]和=,因此所有的賦值和獲取數據都可以通過[]實現 Value &operator=(const Value &other); // 簡單的方式完成 val["姓名"] = "SnowK"; Value& operator[](const std::string& key); Value& operator[](const char* key); // 移除元素 Value removeMember(const char* key); // val["成績"][0] const Value& operator[](ArrayIndex index) const; // 添加數組元素val["成績"].append(88); Value& append(const Value& value); // 獲取數組元素個數 val["成績"].size(); ArrayIndex size() const; // 轉string string name = val["name"].asString(); std::string asString() const; // 轉char* char *name = val["name"].asCString(); const char* asCString() const; // 轉int int age = val["age"].asInt(); int asInt() const; // 轉float float asFloat() const; // 轉 bool bool asBool() const; }; //json序列化類,低版本用這個更簡單 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 序列化類,高版本推薦,如果用低版本的接口可能會有警告 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反序列化類,低版本用起來更簡單 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生產出Json::StreamWriter Json::StreamWriterBuilder swb; std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter()); // 通過Json::StreamWrite的write()進行序列化 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; }
總結
到此這篇關于C++第三方庫jsoncpp的文章就介紹到這了,更多相關C++第三方庫jsoncpp內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!