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++中的实现原理、使用规则、适用场景及优势,并提供了避坑指南,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • C实现的非阻塞方式命令行端口扫描器源码

    C实现的非阻塞方式命令行端口扫描器源码

    这篇文章主要介绍了C实现的非阻塞方式命令行端口扫描器源码,对于大家理解C端口扫描器有很大帮主,需要的朋友可以参考下
    2014-07-07
  • C++实现LeetCode(147.链表插入排序)

    C++实现LeetCode(147.链表插入排序)

    这篇文章主要介绍了C++实现LeetCode(147.链表插入排序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 常用的C语言编程工具汇总

    常用的C语言编程工具汇总

    c语言编程软件适于编写系统软件,是学习编程的同学们的必备软件。c语言一种非常强大的计算机语言,应用非常广泛,不仅仅是在软件开发上,而且各类科研都会用到c语言。今天小编给大家汇总下C语言的编程工具
    2018-01-01
  • C++项目中使用.dll 和.def 文件的操作指南

    C++项目中使用.dll 和.def 文件的操作指南

    在 C++ 项目中,当我们只有 sqlite3.dll 和 .def 文件,但没有 .lib 文件时,通常需要生成 .lib 文件以便项目链接或直接调用 sqlite3.dll,本文将介绍几种方法来生成 .lib 文件,或者在不生成 .lib 文件的情况下直接调用 sqlite3.dll,需要的朋友可以参考下
    2025-07-07
  • 一个快速排序算法代码分享

    一个快速排序算法代码分享

    一个快速排序算法代码一个快速排序算法代码,代码内有注释,大家参考使用吧
    2014-01-01
  • C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    本文主要介绍了C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C程序结构的入门

    C程序结构的入门

    在我们学习 C 语言的基本构建块之前,让我们先来看看一个最小的 C 程序结构,在接下来的章节中可以以此作为参考
    2021-06-06
  • c语言单链表尾添加的深入讲解

    c语言单链表尾添加的深入讲解

    这篇文章主要给大家介绍了关于c语言单项链表尾添加的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C++ 实现高性能HTTP客户端

    C++ 实现高性能HTTP客户端

    HttpClient可以实现所有HTTP的方法,通过API传输接收HTTP消息。本文详细讲解了HttpClient,以及如何运用C++实现HTTP客户端,感兴趣的朋友可以参考一下
    2021-08-08

最新评论