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常用的序列化和反序列化做一个代码演示:
f8271db5a68649248c98f4d6a23ad296.png
#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;
}

318b5feecbee428fb39d10942423e50e.png

对于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;
}

07388950edde4b1ba9fc4e28c819fd85.png

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐