目录
- 序列化&反序列化单个对象
-
- 序列化&反序列化对象列表
C++中可以使用第三方库来实现将类序列化成JSON文件,以及读取JSON文件内容反序列化为类对象。
这里使用rapidJson,github链接:https://github.com/Tencent/rapidjson
使用的话也比较简单,拉下代码,然后将rapidjson-master/include/rapidjson目录拉到自己文件目录下,然后在编译参数上加上-I./rapidjson
即可
以下是一个使用RapidJSON库的示例代码:
序列化&反序列化单个对象
序列化
#include <rapidjson/document.h>
#include <rapidjson/writer.h>
#include <rapidjson/stringbuffer.h>
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<rapidjson::StringBuffer> 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<char>(ifs)), std::istreambuf_iterator<char>());
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 <iostream>
#include <fstream>
#include <string>
#include <vector>
#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) {}
void 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());
}
void deserialize(const Value& obj) {
name = obj["name"].GetString();
age = obj["age"].GetInt();
email = obj["email"].GetString();
}
};
void serializeToJson(const std::string& filename, const std::vector<Person>& persons) {
Document doc;
doc.SetArray();
for (const auto& person : persons) {
person.serialize(doc);
}
StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
doc.Accept(writer);
std::ofstream ofs(filename);
ofs << buffer.GetString() << std::endl;
}
std::vector<Person> deserializeFromJson(const std::string& filename) {
std::vector<Person> 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<char>(ifs)), (std::istreambuf_iterator<char>()));
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<Person> persons = {
{"Alice", 30, "alice@example.com"},
{"Bob", 25, "bob@example.com"},
{"Charlie", 35, "charlie@example.com"}
};
serializeToJson("persons.json", persons);
std::vector<Person> deserializedPersons = deserializeFromJson("persons.json");
for (const auto& person : deserializedPersons) {
std::cout << "Name: " << person.name << ", Age: " << person.age << ", Email: " << person.email << std::endl;
}
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)