- Json源码地址
- 为什么用Json
- Json介绍
- Json第三方库
- Json用法 序列化
- 用法1
- 用法2 复杂类型
- 用法3
- Json用法 反序列化
- 用法1
- 用法2
- 用法3
只有一个hpp文件,直接调用即可
#include “json.hpp”
using json = nlohmann::json;
GitHub
相比于protobuf json更加简单。
相对于xml来说,json格式更加简洁,存储同样的文件,花费的内存更小。
假设客户端是java写的,服务器是c++写的,就相当于一个人讲英语,一个人讲中文,但是大家都认识json,所以发啥消息只需要把消息封装成Json即可。
Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON for Modern C++ 是一个由德国大牛 nlohmann 编写的在 C++ 下使用的 JSON 库。
具有以下特点
- 直观的语法
- 整个代码由一个头文件组成 json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便
- 使用 C++ 11 标准编写
- 使用 json 像使用 STL 容器一样
- STL 和 json 容器之间可以相互转换
- 严谨的测试:所有类都经过严格的单元测试,覆盖了 100% 的代码,包括所有特殊的行为。此外,还检查了 Valgrind 是否有内存泄漏。为了保持高质量,该项目遵循核心基础设施倡议(CII)的最佳实践
string func1()
{
json js;
js["msg_type"] = 2;
js["from"] = "zhang san";
js["to"] = "li si";
js["msg"] = "hello, what are you doing now?";
string sendBuf = js.dump();
//cout<
用法2 复杂类型
string func2()
{
json js;
// 添加数组
js["id"] = {1, 2, 3, 4, 5};
// 添加key-value
js["name"] = "zhang san";
// 添加对象
js["msg"]["zhang san"] = "hello world";
js["msg"]["liu shuo"] = "hello china";
// 上面等同于下面这句一次性添加数组对象
js["msg"] = {{"zhang san", "hello world"}, {"liu shuo", "hello china"}};
//cout << js << endl;
return js.dump();
}
用法3
string func3()
{
json js;
// 直接序列化一个vector容器
vector vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(5);
js["list"] = vec;
// 直接序列化一个map容器
map m;
m.insert({1, "挺好的?"});
m.insert({2, "华山"});
m.insert({3, "泰山"});
js["path"] = m;
string sendBuf = js.dump(); // json数据对象 =》序列化 json字符串
//cout<
{“list”:[1,2,5],“path”:[[1,“黄山”],[2,“华山”],[3,“泰山”]]}
Json用法 反序列化
用法1
// 数据的反序列化 json字符串 =》反序列化 数据对象(看作容器,方便访问)
json jsbuf = json::parse(recvBuf);
cout<
用法2
cout<
用法3
auto msgjs = jsbuf["msg"];
cout< v = js2["list"];
for(int val : v)
{
cout << val << " ";
}
cout << endl;
// 直接反序列化map容器
map m2 = js2["path"];
for(auto p : m2)
{
cout << p.first << " " << p.second << endl;
}
cout << endl;



