欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++第三方庫(kù)jsoncpp超詳細(xì)講解

 更新時(shí)間:2024年10月15日 11:01:15   作者:DieSnowK  
這篇文章主要介紹了C++第三方庫(kù)jsoncpp的相關(guān)資料,JSONcpp是一個(gè)在C++中用于處理JSON數(shù)據(jù)的庫(kù),支持JSON格式的序列化和反序列化,通過(guò)JSONcpp,可以輕松地將數(shù)據(jù)對(duì)象組織成JSON格式的字符串,需要的朋友可以參考下

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)型,直接使用

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)文章

最新評(píng)論