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;
}

相关内容

热门资讯

玩家必备分享( 大众互娱 有透... 亲.大众互娱这款游戏是可以开挂的,确实是有挂的,通过添加客服【9503776】很多玩家在这款游戏中怀...
(我来分享给您)“新玉海楼茶苑... (我来分享给您)“新玉海楼茶苑.真的有挂吗@原来真的有挂您好:新玉海楼茶苑这款游戏可以开挂,确实是有...
资深记者揭秘“全民游戏究竟有开... 亲.“全民游戏这款游戏是可以开挂的,确实是有挂的,通过添加客服【66168283】很多玩家在这款游戏...
玩家实测“新版人皇大厅如何安装... 您好:新版人皇大厅这款游戏可以开挂,确实是有挂的,需要软件加微信【6355786】,很多玩家在新版人...
科普实测“新道游斗牛其实真有透... 您好:新道游斗牛这款游戏可以开挂,确实是有挂的,需要软件加微信【4194432】,很多玩家在新道游斗...