C++使用rapidjson进行类的序列化与反序列化
创始人
2025-06-01 13:14:54

目录

  • 序列化&反序列化单个对象
    • 序列化
    • 反序列化
    • 使用示例
  • 序列化&反序列化对象列表

C++中可以使用第三方库来实现将类序列化成JSON文件,以及读取JSON文件内容反序列化为类对象。
这里使用rapidJson,github链接:https://github.com/Tencent/rapidjson
使用的话也比较简单,拉下代码,然后将rapidjson-master/include/rapidjson目录拉到自己文件目录下,然后在编译参数上加上-I./rapidjson即可
以下是一个使用RapidJSON库的示例代码:

序列化&反序列化单个对象

序列化

#include 
#include 
#include class MyClass {
public:int id;std::string name;double score;MyClass(int id, std::string name, double score) : id(id), name(name), score(score) {}
};void serialize(MyClass& obj, std::string filename) {rapidjson::Document doc;doc.SetObject();rapidjson::Value id;id.SetInt(obj.id);doc.AddMember("id", id, doc.GetAllocator());rapidjson::Value name;name.SetString(obj.name.c_str(), obj.name.length(), doc.GetAllocator());doc.AddMember("name", name, doc.GetAllocator());rapidjson::Value score;score.SetDouble(obj.score);doc.AddMember("score", score, doc.GetAllocator());rapidjson::StringBuffer buffer;rapidjson::Writer writer(buffer);doc.Accept(writer);std::ofstream ofs(filename);ofs << buffer.GetString();ofs.close();
}

反序列化

MyClass deserialize(std::string filename) {std::ifstream ifs(filename);std::string content((std::istreambuf_iterator(ifs)), std::istreambuf_iterator());ifs.close();rapidjson::Document doc;doc.Parse(content.c_str());int id = doc["id"].GetInt();std::string name = doc["name"].GetString();double score = doc["score"].GetDouble();return MyClass(id, name, score);
}

使用示例

int main() {MyClass obj(1, "John", 90.5);serialize(obj, "myclass.json");MyClass new_obj = deserialize("myclass.json");std::cout << new_obj.id << " " << new_obj.name << " " << new_obj.score << std::endl;return 0;
}

序列化&反序列化对象列表

#include 
#include 
#include 
#include 
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"using namespace rapidjson;class Person {
public:std::string name;int age;std::string email;Person() {}Person(const std::string& n, int a, const std::string& e) : name(n), age(a), email(e) {}// 序列化为jsonvoid serialize(Document& doc) const {Value obj(kObjectType);obj.AddMember("name", Value().SetString(name.c_str(), name.length()), doc.GetAllocator());obj.AddMember("age", age, doc.GetAllocator());obj.AddMember("email", Value().SetString(email.c_str(), email.length()), doc.GetAllocator());doc.PushBack(obj, doc.GetAllocator());}// 从json反序列化void deserialize(const Value& obj) {name = obj["name"].GetString();age = obj["age"].GetInt();email = obj["email"].GetString();}
};// 将类对象的列表序列化为json文件
void serializeToJson(const std::string& filename, const std::vector& persons) {Document doc;doc.SetArray();for (const auto& person : persons) {person.serialize(doc);}StringBuffer buffer;Writer writer(buffer);doc.Accept(writer);std::ofstream ofs(filename);ofs << buffer.GetString() << std::endl;
}// 从json文件中读取内容反序列化为类对象列表
std::vector deserializeFromJson(const std::string& filename) {std::vector persons;std::ifstream ifs(filename);if (!ifs.is_open()) {std::cerr << "Failed to open file " << filename << std::endl;return persons;}std::string content((std::istreambuf_iterator(ifs)), (std::istreambuf_iterator()));Document doc;doc.Parse(content.c_str());if (!doc.IsArray()) {std::cerr << "Invalid json format" << std::endl;return persons;}for (const auto& value : doc.GetArray()) {Person person;person.deserialize(value);persons.push_back(person);}return persons;
}int main() {std::vector persons = {{"Alice", 30, "alice@example.com"},{"Bob", 25, "bob@example.com"},{"Charlie", 35, "charlie@example.com"}};// 序列化为json文件serializeToJson("persons.json", persons);// 从json文件中反序列化std::vector deserializedPersons = deserializeFromJson("persons.json");// 输出反序列化后的结果for (const auto& person : deserializedPersons) {std::cout << "Name: " << person.name << ", Age: " << person.age << ", Email: " << person.email << std::endl;}return 0;
}

相关内容

热门资讯

停牌前涨停的永太科技未获“宁王... 锂电材料商浙江永太科技股份有限公司(下称“永太科技”,002326.SZ)最新披露的一则公告显示,其...
32:29!俄罗斯首次落后,中... 西方权威军事机构最新评估报告显示,中国现役核潜艇数量已达32艘,首次超过29艘的俄罗斯,跃居全球第二...
豆包2.0的目标,不是成为做题... 对于大模型,OpenAI、Anthropic、谷歌等全球顶尖的AI公司,都在不断地强调模型的通用性,...
最长春节,年轻人把年过到海外 定焦One(dingjiaoone)原创作者 | 李梦冉编辑 | 魏佳这个春节,出境游彻底火了。根据...
中国最惨大学专业,已经开始招不... 订阅 快刀财经 ▲ 做您的私人商学院外语专业,告别黄金时代。作者:打苦来源:网易数读(ID:data...