赞
踩
序列化,就是把内存里“活的对象”转换成静止的字节序列,便于存储和网络传输;而反序列化则是反向操作,从静止的字节序列重新构建出内存里可用的对象。
数据交换格式:JSON、MessagePack 和 ProtoBuffer。
对数据做序列化和反序列化:
JSON 是一种轻量级的数据交换格式,采用纯文本表示,所以是“human readable”,阅读和修改都很方便。JSON。第三工具:精选出序列化 / 反序列化、网络通信、脚本语言混合编程和性能分析这四类工具。
由于 JSON 起源于“最流行的脚本语言”JavaScript,所以它也随之得到了广泛的应用,在 Web 开发领域几乎已经成为了事实上的标准,而且还渗透到了其他的领域。比如很多数据库就支持直接存储 JSON 数据,还有很多应用服务使用 JSON 作为配置接口。在JSON 的官方网站上,你可以找到大量的 C++ 实现,不过用起来都差不多。因为 JSON 本身就是个 KV 结构,很容易映射到类似 map 的关联数组操作方式。
JSON 格式注重的是方便易用,在性能上没有太大的优势,所以一般选择 JSON 来交换数据,通常都不会太在意性能(不然肯定会改换其他格式了),还是自己用着顺手最重要。
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文本,原始
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。