Json学习与实践
1 Json
json是一种轻量化的数据交换格式/数据序列化格式。独立于编程语言。其简洁和清晰的层次化结构可以在客户端和服务器之间高效的通信。(mssage-------数据序列化----json-----数据反序列化------message)。
其次还有xml、protobuf。
1.1 Json数据序列化
json可以看作STL容器一样使用。
json数据只有序列化为字符串流才可以在网络中传输。
方法:json.dump()
#include"json.hpp"
using json=nlohmann::json;
#include<iostream>
using namespace std;
#include<vector>
#include<map>
#include<string>
void test01(){
//创建json对象
json js;
//json使用类似于unordered_map,键值对、无序
//值类型可以是字符串、数组、也可以是json字符串(同一个键不同键值)
js["id"]={1,2,3,4};
js["msg"]["text1"]="aaa";
js["msg"]["text1"]="bbb";
js["abd"]={{"1","yyy"},{2,"zzz"}};
js["msg_type"]=2;
js["from"]="zhang san";
js["to"]="li si";
js["ask"]="hello";
cout<<js<<endl;
/*{"ask":"hello","from":"zhang san","msg_type":2,"to":"li si"}*/
//在网络中需要数据序列化转化为字节流或者字符流
string sendbuf=js.dump();
//转换为c风格的字符串char*
cout<<sendbuf.c_str()<<endl;
/*{"ask":"hello","from":"zhang san","msg_type":2,"to":"li si"}*/
}
int main(){
test01();
return 0;
}
//json容器序列化
void test02(){
json js;
vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
js["list"]=v;
map<int,string>m;
m.insert({1,"aaa"});
m.insert({2,"bbb"});
m.insert(make_pair(3,"ccc"));
js["map"]=m;
cout<<js<<endl;
/*{"list":[1,2,3],"map":[[1,"aaa"],[2,"bbb"],[3,"ccc"]]}*/
}
1.2 Json数据反序列化
网络字符串流转化为json,得到json对象,访问值采用键值对方式,对值的类型可以直接用对应的数据类型或者容器进行接收,便于访问。
auto arr=jsbuf["id"];
vector<int> v=jsbuf["list"];
方法:json js = json::parse(str)
//json数据反序列化
string test03(){
//创建json对象
json js;
js["msg_type"]=2;
js["from"]="zhang san";
js["to"]="li si";
js["ask"]="hello";
cout<<js<<endl;
/*{"ask":"hello","from":"zhang san","msg_type":2,"to":"li si"}*/
//在网络中需要数据序列化转化为字节流或者字符流
string sendbuf=js.dump();
return sendbuf;
}
int main(){
//test01();
//test02();
string recvBuf=test03();
//进行反序列化,由字符串转化为数据对象,看作容器方便访问
json jsBuf=json::parse(recvBuf);
cout<<jsBuf["msg_type"]<<endl;
cout<<jsBuf["from"]<<endl;
cout<<jsBuf["to"]<<endl;
cout<<jsBuf["ask"]<<endl;
/*2
"zhang san"
"li si"
"hello"
*/
return 0;
}