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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现万年历程序

    C语言实现万年历程序

    这篇文章主要为大家详细介绍了C语言实现万年历程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件操作的相关资料,需要的朋友可以参考下
    2021-10-10
  • java string对象上的操作,常见的用法你知道吗

    java string对象上的操作,常见的用法你知道吗

    今天给大家带来的是关于Java的相关知识,文章围绕着Java String类用法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-08-08
  • 基于c++计算矩形重叠面积代码实例

    基于c++计算矩形重叠面积代码实例

    这篇文章主要介绍了基于c++计算矩形重叠面积代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • C语言实现快速排序的方法及优化

    C语言实现快速排序的方法及优化

    这篇文章主要介绍了C语言实现快速排序的方法及优化,快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,下面我们来看一看传说中的快速排序的特点与效率怎么样,需要的朋友可以参考下
    2023-07-07
  • Matlab实现四种HSV色轮图绘制的示例代码

    Matlab实现四种HSV色轮图绘制的示例代码

    色轮图就是色彩相位图,它完整表现了色相环360度的全部颜色。本文将利用Matlab语言绘制四种不同的HSV色轮图,感兴趣的可以动手尝试一下
    2022-07-07
  • 老生常谈C语言静态函数库的制作和使用

    老生常谈C语言静态函数库的制作和使用

    下面小编就为大家带来一篇老生常谈C语言静态函数库的制作和使用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • 实例讲解C++编程中对设计模式中的原型模式的使用

    实例讲解C++编程中对设计模式中的原型模式的使用

    这篇文章主要介绍了C++编程中对设计模式中的原型模式的使用实例,包括原型模式中对C++的深拷贝和浅拷贝的处理,需要的朋友可以参考下
    2016-03-03
  • C语言中的fscanf()函数与vfscanf()函数使用

    C语言中的fscanf()函数与vfscanf()函数使用

    这篇文章主要介绍了C语言中的fscanf()函数与vfscanf()函数使用,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C语言动态数组详解

    C语言动态数组详解

    本文给大家分享的是一则使用C语言实现动态数组的代码,完美解决内存溢出以及内存回收问题,有需要的小伙伴可以参考下
    2021-09-09

最新评论