C++操作.json文件的超详细新手教程
什么是JSON文件?
JSON全称JavaScript Object Notation,是一种轻量级的数据交换格式。它基于JavaScript语言的一个子集,采用完全独立于编程语言的文本格式标准来表示数据。JSON实现简单,易于读写,同时易于机器解析和生成,因此成为前后端数据交互的重要工具。
选择合适的JSON库
C++中有许多JSON解析库,常用的有RapidJSON和Jsoncpp等。下面以RapidJSON为例,介绍如何操作JSON文件。
RapidJSON的安装和使用
安装
RapidJSON新版本在GitHub中可以获得,下载地址为:https://github.com/Tencent/rapidjson。下载后使用CMake进行编译,生成相应的库文件。
使用
使用RapidJSON很简单,只需包含相应的头文件:
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
读取JSON文件
为了开发者的方便,RapidJSON提供了一个Document类,可以实现JSON字符串和JSON对象的转换。下面介绍如何从JSON文件中读取并分析其中的数据。
#include "rapidjson/document.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace rapidjson;
using namespace std;
string ReadJsonFile(const char* fileName) {
ifstream ifs(fileName);
if (!ifs.is_open()) {
cerr << "Failed to open file: " << fileName << endl;
return "";
}
string str((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
ifs.close();
return str;
}
int main() {
// 读取JSON文件,获取其内容
string jsonStr = ReadJsonFile("test.json");
if (jsonStr.empty()) {
cout << "Failed to read json file" << endl;
return -1;
}
// 解析JSON
Document doc;
doc.Parse(jsonStr.c_str());
if (!doc.IsObject()) {
cout << "Json format error" << endl;
return -1;
}
// 遍历JSON
cout << "name:" << doc["name"].GetString() << endl;
cout << "age:" << doc["age"].GetInt() << endl;
cout << "is_student:" << (doc["is_student"].GetBool() ? "true" : "false") << endl;
return 0;
}
上述代码中,ReadJsonFile函数实现对JSON文件的读取,然后通过Document类实现JSON转换,最后可以用下标操作符或者相应的Get函数获取JSON数据。
修改JSON文件
除读取外,也可以通过Document类实现JSON文件的修改。下面通过示例来演示如何修改JSON文件。
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace rapidjson;
using namespace std;
string ReadJsonFile(const char* fileName) {
ifstream ifs(fileName);
if (!ifs.is_open()) {
cerr << "Failed to open file: " << fileName << endl;
return "";
}
string str((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
ifs.close();
return str;
}
void WriteJsonFile(const char* fileName, const Document& doc) {
ofstream ofs(fileName);
if (!ofs.is_open()) {
cerr << "Failed to create the output file" << endl;
return;
}
StringBuffer sb;
Writer<StringBuffer> writer(sb);
doc.Accept(writer);
ofs << sb.GetString();
ofs.close();
}
int main() {
// 读取JSON文件,获取其内容
string jsonStr = ReadJsonFile("test.json");
if (jsonStr.empty()) {
cout << "Failed to read json file" << endl;
return -1;
}
// 解析JSON
Document doc;
doc.Parse(jsonStr.c_str());
if (!doc.IsObject()) {
cout << "Json format error" << endl;
return -1;
}
// 修改JSON
doc["is_student"].SetBool(true);
++doc["age"].GetInt();
// 将JSON写入文件
WriteJsonFile("output.json", doc);
return 0;
}
上述代码中,我们可以使用Document的SetBool和GetInt函数实现JSON的修改,然后使用WriteJsonFile函数将修改后的JSON写入文件中。需要注意的是,在修改完JSON后需要执行Accept函数,以将修改操作写入到内部数据结构中。
至此,C++操作JSON文件的超详细新手教程介绍完毕,希望对初学者有所帮助。
示例
示例1:读取状态数据
假设我们有一个名为“state.json”的JSON文件,该文件存储了用户的一些状态数据,包括是否已登录(Boolean类型)、金币数量(Integer类型)以及最近一次登录的日期时间(String类型),JSON形式如下:
{
"is_login": true,
"coin_num": 9999,
"last_login": "2021-08-01 12:00:00"
}
我们可以通过下面的代码读取该JSON文件并修改其中的状态数据:
#include "rapidjson/document.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace rapidjson;
using namespace std;
string ReadJsonFile(const char* fileName) {
ifstream ifs(fileName);
if (!ifs.is_open()) {
cerr << "Failed to open file: " << fileName << endl;
return "";
}
string str((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
ifs.close();
return str;
}
int main() {
// 读取JSON文件,获取其内容
string jsonStr = ReadJsonFile("state.json");
if (jsonStr.empty()) {
cout << "Failed to read json file" << endl;
return -1;
}
// 解析JSON
Document doc;
doc.Parse(jsonStr.c_str());
if (!doc.IsObject()) {
cout << "Json format error" << endl;
return -1;
}
// 遍历JSON
cout << "is_login:" << (doc["is_login"].GetBool() ? "true" : "false") << endl;
cout << "coin_num:" << doc["coin_num"].GetInt() << endl;
cout << "last_login:" << doc["last_login"].GetString() << endl;
return 0;
}
示例2:修改状态数据
为了让状态数据更真实,我们需要将用户的金币数增加10000,而最近一次登录的日期时间需要更改为当前的日期时间。修改JSON文件的代码如下:
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <fstream>
#include <iostream>
#include <string>
#include <ctime>
using namespace rapidjson;
using namespace std;
string ReadJsonFile(const char* fileName) {
ifstream ifs(fileName);
if (!ifs.is_open()) {
cerr << "Failed to open file: " << fileName << endl;
return "";
}
string str((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
ifs.close();
return str;
}
void WriteJsonFile(const char* fileName, const Document& doc) {
ofstream ofs(fileName);
if (!ofs.is_open()) {
cerr << "Failed to create the output file" << endl;
return;
}
StringBuffer sb;
Writer<StringBuffer> writer(sb);
doc.Accept(writer);
ofs << sb.GetString();
ofs.close();
}
int main() {
// 读取JSON文件,获取其内容
string jsonStr = ReadJsonFile("state.json");
if (jsonStr.empty()) {
cout << "Failed to read json file" << endl;
return -1;
}
// 解析JSON
Document doc;
doc.Parse(jsonStr.c_str());
if (!doc.IsObject()) {
cout << "Json format error" << endl;
return -1;
}
// 修改JSON
doc["coin_num"].SetInt(doc["coin_num"].GetInt() + 10000);
time_t t = time(nullptr);
char date[64];
strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&t));
doc["last_login"].SetString(date, strlen(date));
// 将修改后的JSON写入文件
WriteJsonFile("state_new.json", doc);
return 0;
}
上述代码中,我们首先使用Document的SetInt和SetString函数实现JSON文件的修改。为使得最近一次登录的日期时间更为真实,我们使用了C++的标准时间库ctime实现currentTime获取。然后,我们再次调用自定义的WriteJsonFile函数将修改后的XML写入到一个新的JSON文件“state_new.json”中。
补充说明:
时间库ctime和localtime是C标准库里的内容,不是JSON库的内容,所以并不需要特殊安装或引用。
在代码中这样调用:
time_t t = time(nullptr);
char date[64];
strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&t));
其中,time函数返回的是当前时间的总秒数(自“2021-01-01 00:00:00”起),成为UTC时间。而strftime函数则可以将时间数据按指定格式打印输出。
在上述代码中,我们指定输出时间的格式为:“%Y-%m-%d %H:%M:%S”,即“年-月-日 时:分:秒”的形式。所以,date变量的输出格式则为:“2021-08-01 12:34:56”的形式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++操作.json文件的超详细新手教程 - Python技术站