开发者

C++第三方库jsoncpp超详细讲解

开发者 https://www.devze.com 2024-10-18 11:29 出处:网络 作者: DieSnowK
目录1.介绍2.jsoncpp3.使用1.main.cc2.序列化3.反序列化总结 1.介绍 json是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据json数据类型:对象、数组、字符串、数字对象:使用{}括起来的表
目录
  • 1.介绍
  • 2.jsoncpp
  • 3.使用
    • 1.main.cc
    • 2.序列化
    • 3.反序列化
  • 总结 

    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()http://www.devze.com;
    	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 CharjsReaderBuilder : 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"].asSt编程客栈ring() << 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.序列化

    booljs 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内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号