序列化:简单通用的数据交换格式JSON、MessagePack 和 ProtoBuffer

序列化,就是把内存里“活的对象”转换成静止的字节序列,便于存储和网络传输;而反序列化则是反向操作,从静止的字节序列重新构建出内存里可用的对象。

数据交换格式:JSON、MessagePack 和 ProtoBuffer。
对数据做序列化和反序列化:

JSON:

JSON 是一种轻量级的数据交换格式,采用纯文本表示,所以是“human readable”,阅读和修改都很方便。JSON。第三工具:精选出序列化 / 反序列化、网络通信、脚本语言混合编程和性能分析这四类工具。

由于 JSON 起源于“最流行的脚本语言”JavaScript,所以它也随之得到了广泛的应用,在 Web 开发领域几乎已经成为了事实上的标准,而且还渗透到了其他的领域。比如很多数据库就支持直接存储 JSON 数据,还有很多应用服务使用 JSON 作为配置接口。在JSON 的官方网站上,你可以找到大量的 C++ 实现,不过用起来都差不多。因为 JSON 本身就是个 KV 结构,很容易映射到类似 map 的关联数组操作方式。

JSON 格式注重的是方便易用,在性能上没有太大的优势,所以一般选择 JSON 来交换数据,通常都不会太在意性能(不然肯定会改换其他格式了),还是自己用着顺手最重要。

JSON for Modern C++

JSON for Modern C++ 可能不是最小最快的 JSON 解析工具,但功能足够完善,而且使用方便,仅需要包含一个头文件“json.hpp”,没有外部依赖,也不需要额外的安装、编译、链接工作,适合快速上手开发。JSON for Modern C++ 可以用“git clone”下载源码,或者更简单一点,直接用 wget 获取头文件就行:

git clone git@github.com:nlohmann/json.git    # git clone
wget https://github.com/nlohmann/json/releases/download/v3.7.3/json.hpp  # wget 

JSON for Modern C++ 使用一个 json 类来表示 JSON 数据,为了避免说的时候弄混,我给这个类起了个别名 json_t:

using json_t = nlohmann::json;

json_t 的序列化功能很简单,和标准容器 map 一样,用关联数组的“[]”来添加任意数据。你不需要特别指定数据的类型,它会自动推导出恰当的类型。比如,连续多个“[]”就是嵌套对象,array、vector 或者花括号形式的初始化列表就是 JSON 数组,map 或者是花括号形式的 pair 就是 JSON 对象,非常自然:

json_t j;                                   // JSON对象

j["age"] = 23;                              // "age":23
j["name"] = "spiderman";                    // "name":"spiderman"
j["gear"]["suits"] = "2099";                // "gear":{"suits":"2099"}
j["jobs"] = {
   "superhero"};                  // "jobs":["superhero"]  

vector<int> v = {
   1,2,3};                   // vector容器
j["numbers"] = v;                          // "numbers":[1,2,3]

map<string, int> m =                       // map容器
    {
   {
   "one",1}, {
   "two", 2}};               // 初始化列表 
j["kv"] = m;                               // "kv":{"one":1,"two":2}

添加完之后,用成员函数 dump() 就可以序列化,得到它的 JSON 文本形式。默认的格式是紧凑输出,没有缩进,如果想要更容易阅读的话,可以加上指示缩进的参数:

cout << j.dump() << endl;         // 序列化,无缩进
cout << j.dump(2) << endl;        // 序列化,有缩进,2个空格

json_t 的反序列化功能同样也很简单,只要调用静态成员函数 parse() 就行,直接得到 JSON 对象,而且可以用 auto 自动推导类型:

string str = R"({
                   // JSON文本,原始
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值