当前位置: 代码网 > it编程>编程语言>Javascript > C++第三方库jsoncpp超详细讲解

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

2024年10月15日 Javascript 我要评论
1.介绍json是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com