通过jsoncpp实现嵌套类与json字符串的相互转换

22 篇文章 0 订阅

由于引入了面向对象的概念,C++ 中的类(结构体)不再是与 C 中结构体类似的 POD(Plain Old Data)类型。因此在进行网络通信或者外存存储时需要单独进行序列化以及反序列化处理。

遗憾的是,C++ 并没有提供类似于 Java 中 ObjectInputStreamObjectOutputStream 这样的序列化手段,不过我们可以通过 jsoncpp 等外部库将类转化为 json 字符串,在进行网络传输时再将 json 字符串转化为网络字节流。

jsoncpp 下载路径为https://github.com/open-source-parsers/jsoncpp

下载后运行 jsoncpp 文件夹下的 amalgamate.py 脚本,生成的 dist 目录即包含了我们所需要的头文件和源文件,直接复制到项目中即可使用。

通过 jsoncpp 实现嵌套类与 json 字符串的相互转换

#include <iostream>
#include <string>
#include "json/json.h"

using namespace std;

/* 内层类 */
class Inner {
private:
    string m_in_id;
    string m_in_password;

public:
    Inner() = default;

    Inner(string in_id, string in_password) : m_in_id(std::move(in_id)), m_in_password(std::move(in_password)) {}

    explicit Inner(const string &json_str) {
        Json::Value value;
        Json::String error;
        Json::CharReaderBuilder builder;
        unique_ptr<Json::CharReader> reader(builder.newCharReader());
        if (!reader->parse(json_str.c_str(), json_str.c_str() + json_str.length(), &value, &error)) {
            cout << "construct from json error, error = " << error << ", json = " << json_str << endl;
        } else {
            m_in_id = value["m_in_id"].asString();
            m_in_password = value["m_in_password"].asString();
        }
    }

    Json::Value toJson() {
        Json::Value value;
        value["m_in_id"] = m_in_id;
        value["m_in_password"] = m_in_password;
        return value;
    }

    string toJsonStr() {
        Json::Value value;
        value["m_in_id"] = m_in_id;
        value["m_in_password"] = m_in_password;
        Json::FastWriter writer;
        string jsonStr = writer.write(value); // 无格式json字符串
        return jsonStr;
    }
};

/* 外层类 */
class Outer {
private:
    string m_out_id;
    string m_out_password;
    Inner m_inner;

public:
    Outer() = default;

    Outer(string out_id, string out_password, string in_id, string in_password) : m_out_id(std::move(out_id)),
                                                              m_out_password(std::move(out_password)),
                                                              m_inner(std::move(in_id), std::move(in_password)) {}

    Outer(const string &json_str) {
        Json::Value value;
        Json::String error;
        Json::CharReaderBuilder builder;
        unique_ptr <Json::CharReader> reader(builder.newCharReader());
        if (!reader->parse(json_str.c_str(), json_str.c_str() + json_str.length(), &value, &error)) {
            cout << "construct from json error, error = " << error << ", json = " << json_str << endl;
        } else {
            m_out_id = value["m_out_id"].asString();
            m_out_password = value["m_out_password"].asString();
            Json::FastWriter writer;
            m_inner = Inner(writer.write(value["m_inner"]));
        }
    }

    string toJsonStr() {
        Json::Value value;
        value["m_out_id"] = m_out_id;
        value["m_out_password"] = m_out_password;
        value["m_inner"] = m_inner.toJson();
        Json::FastWriter writer;
        string jsonStr = writer.write(value); // 无格式json字符串
        return jsonStr;
    };
};

int main() {
    string out_json_str;
    Outer outer_old("111", "111", "222", "222");
    cout << (out_json_str = outer_old.toJsonStr());

    Outer outer_new(out_json_str);
    cout << outer_new.toJsonStr();
}

atreus@MacBook-Pro % clang++ -I ./json/json.h main.cpp jsoncpp.cpp -o main -std=c++11
atreus@MacBook-Pro % ./main 
{"m_inner":{"m_in_id":"222","m_in_password":"222"},"m_out_id":"111","m_out_password":"111"}
{"m_inner":{"m_in_id":"222","m_in_password":"222"},"m_out_id":"111","m_out_password":"111"}
atreus@MacBook-Pro % 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值