C++中使用json

因为项目的原因,需要在代码中读写json格式的数据。又因为不是采用的Qt,所以不能直接使用Qt的json读写,因此选择了第三方库rapidjson

关于json的语法,可以查阅我的另一篇博客json介绍及使用QJson操作json格式数据,这里面对于json的语法以及Qt对于json格式数据的操作进行了比较详细的介绍。

rapidjson仅仅是生成/解析json格式的数据,并不涉及到具体的文件的读写操作。

使用rapidjson的步骤:

1. 项目中导入rapidjson模块

首先导入rapidjson文件夹,如下图所示:
在这里插入图片描述
然后在项目中包含此目录。

2. 使用

这里面仅仅介绍一些简单使用。

2.1 写json数据

直接上源码:

#include <iostream>
#include <fstream>
#include <string>

#include "rapidjson/writer.h"
//#include "rapidjson/prettywriter.h"///<这个多了个格式
#include "rapidjson/stringbuffer.h"

using namespace std;
void write_json()
{
	fstream file("./jsTest.json", ios::out);

	if (!file.is_open())
	{
		cout << "can not open json file to write." << endl;
		return;
	}

	rapidjson::StringBuffer strBuffer;
	rapidjson::Writer<rapidjson::StringBuffer> writer(strBuffer);
	//< 如果想要格式更好,只需要换成下面的这个类即可。
	//rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(strBuffer);

	writer.StartObject();

	writer.Key("ID");
	writer.String("111999");
	writer.Key("Name");
	writer.String("XiaoMing");
	writer.Key("Age");
	writer.Int(18);

	writer.Key("Grade");
	writer.StartArray();
	writer.StartObject();
	writer.Key("Chinese");
	writer.Int(100);
	writer.EndObject();
	writer.StartObject();
	writer.Key("Math");
	writer.Int(99);
	writer.EndObject();
	writer.EndArray();

	writer.EndObject();

	file << strBuffer.GetString() << endl;
}

int main(int argc, char *argv[])
{
	write_json();

	return 0;
}

这里面需要注意的是,rapidjson仅仅负责生成json格式的数据,具体的文件的写入还是需要依托于fstream。
生成的文件如下:
在这里插入图片描述
发现是正常写入了,但是格式看起来有点丑,不用担心,这里面有另一个类PrettyWriter,只需要将

rapidjson::Writer<rapidjson::StringBuffer> writer(strBuffer);

换成

rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(strBuffer);

即可。
这是换完之后的结果:
在这里插入图片描述

2.2 读json

一样,先上源码:

#include <iostream>
#include <fstream>
#include <string>

#include "rapidjson/document.h"

using namespace std;

string read_json()
{
	fstream file("./jsTest.json", ios::in);

	if (!file.is_open())
	{
		cout << "can not open json failed." << endl;
		return string();
	}

	string rawJsonData((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());
	file.close();

	string strRth;

	rapidjson::Document doc;
	if (!doc.Parse(rawJsonData.c_str()).HasParseError())
	{
		if (doc.HasMember("ID") && doc["ID"].IsString())
		{
			strRth += "ID:";
			strRth += doc["ID"].GetString();
			strRth += '\n';
		}

		if (doc.HasMember("Name") && doc["Name"].IsString())
		{
			strRth += "Name:";
			strRth += doc["Name"].GetString();
			strRth += '\n';
		}

		if (doc.HasMember("Age") && doc["Age"].IsInt())
		{
			strRth += "Age:";
			strRth += to_string(doc["Age"].GetInt());
			strRth += '\n';
		}

		if (doc.HasMember("Grade") && doc["Grade"].IsArray())
		{
			const rapidjson::Value & array = doc["Grade"];

			strRth += "Grade:\n";

			for (int i(0); i < array.Size(); ++i)
			{
				const rapidjson::Value &val = array[i];

				if (val.IsObject())
				{
					if (val.HasMember("Chinese") && val["Chinese"].IsInt())
					{
						strRth += "Chinese:";
						strRth += to_string(val["Chinese"].GetInt());
						strRth += '\t';
					}
					if (val.HasMember("Math") && val["Math"].IsInt())
					{
						strRth += "Math:";
						strRth += to_string(val["Math"].GetInt());
						strRth += '\t';
					}
				}
			}
		}
	}
	

	return strRth;
}

int main(int argc, char *argv[])
{
	cout << read_json() << endl;

	system("pause");

	return 0;
}

也比较简单,只需要在开始的使用使用rapidjson::Document绑定到读取到的字符串上就可以了,绑定之后这个rapidjson::Document就可以解析出是否是json格式的字符串,如果是,那么就可以正常进行下方的解析操作。

这是演示结果:
在这里插入图片描述

3. 总结

需要使用到的第三方库是rapidjson。

json格式的数据的时候,生成json格式的数据的工具类是rapidjson::Writer和rapidjson::StringBuffer。如果需要格式美观,则可以将rapidjson::Writer换成rapidjson::PrettyWriter。

json格式的数据的时候,使用到的解析json格式的工具类是rapidjson::Document。

参考链接

参考链接
RapidJSON 文档

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值