C++构造和解析Json的使用示例
简介
Json是一种轻量级的数据交换格式,常用于前后端数据传输、配置文件等。本文将介绍在C++中如何构造和解析Json数据。
Json库
C++中有很多称手的Json库,常用的有:
这些库都提供了简单易用的Api,形式上大同小异,具体使用可以结合文档查询。
以下示例以RapidJson为例进行说明。
构造Json数据
RapidJson提供了Document类型表示Json文档,可以通过以下方式构造Json数据:
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
using namespace rapidjson;
int main() {
Document doc;
doc.SetObject(); // 构造一个Object类型的Json
Value name;
name.SetString("Alice");
doc.AddMember("name", name, doc.GetAllocator());
Value age;
age.SetInt(20);
doc.AddMember("age", age, doc.GetAllocator());
Value interests;
interests.SetArray();
Value hobby1, hobby2;
hobby1.SetString("reading");
hobby2.SetString("music");
interests.PushBack(hobby1, doc.GetAllocator());
interests.PushBack(hobby2, doc.GetAllocator());
doc.AddMember("interests", interests, doc.GetAllocator());
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
doc.Accept(writer);
std::cout << buffer.GetString() << std::endl;
return 0;
}
以上代码通过向Document对象添加Value类型的成员构造一个Json对象,并将其输出到标准输出流。
输出结果:
{"name":"Alice","age":20,"interests":["reading","music"]}
解析Json数据
解析Json也是同样简单,只需在Document对象上调用Parse()方法,传入Json数据即可。
const char* json = "{\"name\":\"Alice\",\"age\":20,\"interests\":[\"reading\",\"music\"]}";
Document doc;
doc.Parse(json);
std::string name = doc["name"].GetString();
int age = doc["age"].GetInt();
std::vector<std::string> interests;
const Value& interestArray = doc["interests"];
for (SizeType i = 0; i < interestArray.Size(); i++) {
interests.push_back(interestArray[i].GetString());
}
std::cout << "name: " << name << std::endl;
std::cout << "age: " << age << std::endl;
std::cout << "interests:" << std::endl;
for (const auto& interest : interests) {
std::cout << "- " << interest << std::endl;
}
以上代码读取一个Json字符串,解析后将数据存储在相应的变量中,并输出到标准输出流。
输出结果:
name: Alice
age: 20
interests:
- reading
- music
示例说明
示例一
假设我们需要在C++程序中读取并处理一个外部服务器的配置文件,文件格式为Json,内容如下所示:
{
"host": "127.0.0.1",
"port": 8080,
"workers": [
{ "name": "worker1", "type": "A", "enabled": true },
{ "name": "worker2", "type": "B", "enabled": false }
]
}
其中,host、port为简单类型,workers为数组类型,其元素为具有多个字段的对象类型。
读取并处理该文件的代码如下:
std::ifstream ifs("/path/to/config.json");
std::string json((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
Document doc;
doc.Parse(json.c_str());
std::string host = doc["host"].GetString();
int port = doc["port"].GetInt();
std::vector<std::string> workerNames;
const Value& workerArray = doc["workers"];
for (SizeType i = 0; i < workerArray.Size(); i++) {
const Value& worker = workerArray[i];
if (worker["enabled"].GetBool()) {
workerNames.push_back(worker["name"].GetString());
}
}
std::cout << "host: " << host << std::endl;
std::cout << "port: " << port << std::endl;
std::cout << "enabled workers:" << std::endl;
for (const auto& workerName : workerNames) {
std::cout << "- " << workerName << std::endl;
}
该代码通过读取文件内容,并使用RapidJson解析Json数据,将host、port与所有enabled的worker名称输出到标准输出流。
输出结果:
host: 127.0.0.1
port: 8080
enabled workers:
- worker1
示例二
假设我们需要将一个C++程序计算得到的数据导出为一个Json文件,格式如下:
{
"input": {
"n": 10,
"m": 5
},
"output": [
{ "value": 3.14, "note": "result 1" },
{ "value": -0.5, "note": "result 2" }
]
}
其中,input为对象类型,包含两个字段;output为数组类型,包含多个对象,其每个对象包含两个字段。
将数据导出为上述Json文件的代码如下:
Document doc;
doc.SetObject();
Value input;
input.SetObject();
input.AddMember("n", 10, doc.GetAllocator());
input.AddMember("m", 5, doc.GetAllocator());
doc.AddMember("input", input, doc.GetAllocator());
Value output;
output.SetArray();
Value result1, result2;
result1.SetObject();
result1.AddMember("value", 3.14, doc.GetAllocator());
result1.AddMember("note", "result 1", doc.GetAllocator());
output.PushBack(result1, doc.GetAllocator());
result2.SetObject();
result2.AddMember("value", -0.5, doc.GetAllocator());
result2.AddMember("note", "result 2", doc.GetAllocator());
output.PushBack(result2, doc.GetAllocator());
doc.AddMember("output", output, doc.GetAllocator());
std::ofstream ofs("/path/to/output.json");
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
doc.Accept(writer);
ofs << buffer.GetString() << std::endl;
以上代码创建了一个Json文档,并将其输出到指定路径下的Json文件。
结语
本文简单介绍了在C++中如何构造和解析Json数据,以提供开发时参考之用。实际应用中需特别注意文档对象的内存管理问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++构造和解析Json的使用示例 - Python技术站