C++第三方庫jsoncpp超詳細講解
更新時間:2024年10月15日 11:01:15 作者:DieSnowK
這篇文章主要介紹了C++第三方庫jsoncpp的相關資料,JSONcpp是一個在C++中用于處理JSON數(shù)據(jù)的庫,支持JSON格式的序列化和反序列化,通過JSONcpp,可以輕松地將數(shù)據(jù)對象組織成JSON格式的字符串,需要的朋友可以參考下
1.介紹
json是一種數(shù)據(jù)交換格式,采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù)json數(shù)據(jù)類型:對象、數(shù)組、字符串、數(shù)字- 對象:使用
{}括起來的表示一個對象 - 數(shù)組:使用
[]括起來的表示一個數(shù)組 - 字符串:使用
""括起來的表示一個字符串 - 數(shù)字:包括整形和浮點型,直接使用
- 對象:使用
2.jsoncpp
jsoncpp庫用于實現(xiàn)json格式的序列化和反序列化,完成將多個數(shù)據(jù)對象組織成為格式字符串解析得到多個數(shù)據(jù)對象的功能
主要借助三個類以及其對應的少量成員函數(shù)完成:
// Json數(shù)據(jù)對象類 -> 用于進行中間數(shù)據(jù)存儲
class Json::Value
{
// Value重載了[]和=,因此所有的賦值和獲取數(shù)據(jù)都可以通過[]實現(xiàn)
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;
// 添加數(shù)組元素val["成績"].append(88);
Value& append(const Value& value);
// 獲取數(shù)組元素個數(shù) 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生產(chǎn)出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內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于OpenCV讀取攝像頭實現(xiàn)單個人臉驗證MFC程序
這篇文章主要為大家詳細介紹了基于OpenCV讀取攝像頭實現(xiàn)單個人臉驗證MFC程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08
新舊MFC版本實現(xiàn)CEdit透明的2種方法的實例代碼
新舊MFC版本實現(xiàn)CEdit透明的2種方法的實例代碼,需要的朋友可以參考一下2013-03-03
vsCode配置import@路徑提示的實現(xiàn)步驟
在導入文件設置路徑的時候方便了很多,本文主要介紹了vsCode配置import@路徑提示的實現(xiàn)步驟,具有一定的參考價值,感興趣的可以了解一下2023-08-08

