因为项目的原因,需要在代码中读写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。