Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式

来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换语言。 易于人阅读和编

写,同时也易于机器解析和生成,并有效地提升网络传输效率。

json的方便:

直观的语法整个代码由一个头文件组成 json.hpp,没有子项目,没有依赖关系,没有复杂的构建系统,使用起来非常方便使用 C++ 11 标准编写使用 json 像使用 STL 容器一样STL 和 json 容器之间可以相互转换严谨的测试:所有类都经过严格的单元测试,覆盖了 100% 的代码,包括所有特殊的行为。此外,还检查了 Valgrind 是否有内存泄漏。为了保持高质量,该项目遵循核心基础设施倡议(CII)的最佳实践

使用json,只需要引入json.hpp头文件即可

在网络中,常用的数据传输序列化格式有XML,Json,ProtoBuf,在公司级别的项目中,大量的在使用

ProtoBuf作为数据序列化的方式,以其数据压缩编码传输,占用带宽小,同样的数据信息,是Json的

1/10,XML的1/20,但是使用起来比Json稍复杂一些

下面对于json常用的序列化和反序列化做一个代码演示:

#include"json.hpp"

using json=nlohmann::json;

Json的序列化就是=把我们想要打包的数据,或者对象,直接处理成Json字符串,Json对象很类似于容器的使用

void func1()

{

json js;//json对象使用类似容器,类似unordered_map

js["msg_type"]=2;

js["from"]="李四";

js["to"]="老王";

js["msg"]="你好啊!";

cout<

//转成字符串,就可以通过网络发送

string sendbuff=js.dump();

cout<

}

void func2()

{

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;

cout<

}

void func3(){

json js;

// 添加数组

js["id"] = {10,9,8,7,6,5};

// 添加key-value

js["name"] = "熊大";

// 添加对象

js["msg"]["熊大"] = "你好光头强";

js["msg"]["熊二"] = "hello china";

// 上面类似下面这句一次性添加数组对象,不过就像map一样不允许有重复键

//下面这个会把上面给覆盖掉

js["msg"] = {{"zhang san", "hello world"}, {"liu shuo", "hello hello"}};

cout << js << endl;

}

int main()

{

func1();

func2();

func3();

return 0;

}

对于Json的反序列化当从网络接收到字符串为Json格式,可以用JSON for Modern C++ 直接反序列化取得数据或者直接反序 列化出对象,甚至容器

对于上面序列化的代码稍加修改,演示反序列化

//反序列化

string func4()

{

json js;//json对象使用类似容器,类似unordered_map

js["msg_type"]=2;

js["from"]="李四";

js["to"]="老王";

js["msg"]="你好啊!";

cout<

//转成字符串,就可以通过网络发送

string sendbuff=js.dump();

return sendbuff;

}

string func5(){

json js;

// 添加数组

js["id"] = {10,9,8,7,6,5};

// 添加key-value

js["name"] = "熊大";

// 添加对象

js["msg"]["熊大"] = "你好光头强";

js["msg"]["熊二"] = "hello china";

// 上面类似下面这句一次性添加数组对象,不过就像map一样不允许有重复键

//下面这个会把上面给覆盖掉

js["msg"] = {{"zhang san", "hello world"}, {"liu shuo", "hello hello"}};

string sendbuff=js.dump();

return sendbuff;

}

string func6()

{

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 sendbuff=js.dump();

return sendbuff;

}

int main()

{

//模拟收到网络传来的

string recvbuff=func4();

//数据反序列化 json字符串 -》反序列化 数据对象

json jsbuff=json::parse(recvbuff);

cout<

cout<

cout<

cout<

string recvbuff1=func5();

json msgbuff=json::parse(recvbuff1);

cout<

auto arr=msgbuff["id"];

for(auto x:arr){

cout<

}

cout<

string recvbuff2=func6();

json vvmapbuff=json::parse(recvbuff2);

vectorvv=vvmapbuff["list"]; //数组

for(auto &x:vv){

cout<

}

cout<

map mp=vvmapbuff["path"]; //map

for(auto &x:mp){

cout<

}

cout<

return 0;

}

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: