C++使用rapidjson进行类的序列化与反序列化

2023-05-16

目录

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

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) {}

    // 序列化为json
    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());
    }

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

// 从json文件中读取内容反序列化为类对象列表
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"}
    };

    // 序列化为json文件
    serializeToJson("persons.json", persons);

    // 从json文件中反序列化
    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(使用前将#替换为@)

C++使用rapidjson进行类的序列化与反序列化 的相关文章

  • Linux环境下LLVM 6.0 + clang安装步骤

    可以转载 xff0c 请注明出处 xff01 1 准备工作 首先确保你的Linux系统是可以联网的 xff0c 我是win10环境下的VMware 15 43 centos 7 xff0c 这个应该没影响 xff0c 之所以说 xff0c
  • Pixhawk ulog飞行日志分析

    在python下安装pyulog xff0c 在 ulog文件目录下输入ulog2csv即可将ulog转化为csv形式输出 ulog文件的保存时间 43 8即为飞行实际的时间 timestamp为时间戳 xff0c 除以10 6后单位为秒
  • java看书规划

    Java编程思想 大话设计模式 重构 改善既有代码的设计 effective java 深入理解Java虚拟机 Java并发编程实战 深入理解计算机系统 xff0c tcp ip详解 卷一 二 三 xff0c 数据结构与算法 xff08 三
  • 学习ROS常用的官方网站,学习资源整理

    1 ROS仿真知识点rviz urdf gazebo的知识点网站 xff1a https wiki ros org urdf http wiki ros org rviz http gazebosim org tutorials tut 6
  • 双非末流一本大四在校生第一次线下面试总结(嵌入式软件实习生方向)

    嵌入式软件实习生面试经验总结 面试写到的技能一定要熟悉 一定要边学习边找工作 xff0c 当你技能不够的时候还是先去学习吧 面试时间 xff1a 11 11 面试公司 xff1a 北京迅为电子有限公司 笔试题目 xff1a xff08 其实

随机推荐