c++11 json解析库nlohmann/json.hpp
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
免费下载资源
·
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<<js<<endl;
//转成字符串,就可以通过网络发送
string sendbuff=js.dump();
cout<<sendbuff.c_str()<<endl;
}
void func2()
{
json js;
// 直接序列化一个vector容器
vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(5);
js["list"] = vec;
// 直接序列化一个map容器
map<int, string> m;
m.insert({1, "黄山"});
m.insert({2, "华山"});
m.insert({3, "泰山"});
js["path"] = m;
cout<<js<<endl;
}
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<<js<<endl;
//转成字符串,就可以通过网络发送
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<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(5);
js["list"] = vec;
// 直接序列化一个map容器
map<int, string> 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<<jsbuff["msg_type"]<<endl;
cout<<jsbuff["from"]<<endl;
cout<<jsbuff["to"]<<endl;
cout<<jsbuff["msg"]<<endl;
string recvbuff1=func5();
json msgbuff=json::parse(recvbuff1);
cout<<msgbuff["id"]<<endl;
auto arr=msgbuff["id"];
for(auto x:arr){
cout<<x<<"---";
}
cout<<endl;
string recvbuff2=func6();
json vvmapbuff=json::parse(recvbuff2);
vector<int>vv=vvmapbuff["list"]; //数组
for(auto &x:vv){
cout<<x<<"....";
}
cout<<endl;
map<int, string> mp=vvmapbuff["path"]; //map
for(auto &x:mp){
cout<<x.first<<"/"<<x.second<<"***";
}
cout<<endl;
return 0;
}
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e
4 个月前
8c391e04
6 个月前
更多推荐
已为社区贡献3条内容
所有评论(0)