当前位置:   article > 正文

c++11 json解析库nlohmann/json.hpp

json.hpp
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
  1. #include"json.hpp"
  2. using json=nlohmann::json;

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

  1. void func1()
  2. {
  3. json js;//json对象使用类似容器,类似unordered_map
  4. js["msg_type"]=2;
  5. js["from"]="李四";
  6. js["to"]="老王";
  7. js["msg"]="你好啊!";
  8. cout<<js<<endl;
  9. //转成字符串,就可以通过网络发送
  10. string sendbuff=js.dump();
  11. cout<<sendbuff.c_str()<<endl;
  12. }
  13. void func2()
  14. {
  15. json js;
  16. // 直接序列化一个vector容器
  17. vector<int> vec;
  18. vec.push_back(1);
  19. vec.push_back(2);
  20. vec.push_back(5);
  21. js["list"] = vec;
  22. // 直接序列化一个map容器
  23. map<int, string> m;
  24. m.insert({1, "黄山"});
  25. m.insert({2, "华山"});
  26. m.insert({3, "泰山"});
  27. js["path"] = m;
  28. cout<<js<<endl;
  29. }
  30. void func3(){
  31. json js;
  32. // 添加数组
  33. js["id"] = {10,9,8,7,6,5};
  34. // 添加key-value
  35. js["name"] = "熊大";
  36. // 添加对象
  37. js["msg"]["熊大"] = "你好光头强";
  38. js["msg"]["熊二"] = "hello china";
  39. // 上面类似下面这句一次性添加数组对象,不过就像map一样不允许有重复键
  40. //下面这个会把上面给覆盖掉
  41. js["msg"] = {{"zhang san", "hello world"}, {"liu shuo", "hello hello"}};
  42. cout << js << endl;
  43. }
  44. int main()
  45. {
  46. func1();
  47. func2();
  48. func3();
  49. return 0;
  50. }

318b5feecbee428fb39d10942423e50e.png

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

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

  1. //反序列化
  2. string func4()
  3. {
  4. json js;//json对象使用类似容器,类似unordered_map
  5. js["msg_type"]=2;
  6. js["from"]="李四";
  7. js["to"]="老王";
  8. js["msg"]="你好啊!";
  9. cout<<js<<endl;
  10. //转成字符串,就可以通过网络发送
  11. string sendbuff=js.dump();
  12. return sendbuff;
  13. }
  14. string func5(){
  15. json js;
  16. // 添加数组
  17. js["id"] = {10,9,8,7,6,5};
  18. // 添加key-value
  19. js["name"] = "熊大";
  20. // 添加对象
  21. js["msg"]["熊大"] = "你好光头强";
  22. js["msg"]["熊二"] = "hello china";
  23. // 上面类似下面这句一次性添加数组对象,不过就像map一样不允许有重复键
  24. //下面这个会把上面给覆盖掉
  25. js["msg"] = {{"zhang san", "hello world"}, {"liu shuo", "hello hello"}};
  26. string sendbuff=js.dump();
  27. return sendbuff;
  28. }
  29. string func6()
  30. {
  31. json js;
  32. // 直接序列化一个vector容器
  33. vector<int> vec;
  34. vec.push_back(1);
  35. vec.push_back(2);
  36. vec.push_back(5);
  37. js["list"] = vec;
  38. // 直接序列化一个map容器
  39. map<int, string> m;
  40. m.insert({1, "黄山"});
  41. m.insert({2, "华山"});
  42. m.insert({3, "泰山"});
  43. js["path"] = m;
  44. string sendbuff=js.dump();
  45. return sendbuff;
  46. }
  47. int main()
  48. {
  49. //模拟收到网络传来的
  50. string recvbuff=func4();
  51. //数据反序列化 json字符串 -》反序列化 数据对象
  52. json jsbuff=json::parse(recvbuff);
  53. cout<<jsbuff["msg_type"]<<endl;
  54. cout<<jsbuff["from"]<<endl;
  55. cout<<jsbuff["to"]<<endl;
  56. cout<<jsbuff["msg"]<<endl;
  57. string recvbuff1=func5();
  58. json msgbuff=json::parse(recvbuff1);
  59. cout<<msgbuff["id"]<<endl;
  60. auto arr=msgbuff["id"];
  61. for(auto x:arr){
  62. cout<<x<<"---";
  63. }
  64. cout<<endl;
  65. string recvbuff2=func6();
  66. json vvmapbuff=json::parse(recvbuff2);
  67. vector<int>vv=vvmapbuff["list"]; //数组
  68. for(auto &x:vv){
  69. cout<<x<<"....";
  70. }
  71. cout<<endl;
  72. map<int, string> mp=vvmapbuff["path"]; //map
  73. for(auto &x:mp){
  74. cout<<x.first<<"/"<<x.second<<"***";
  75. }
  76. cout<<endl;
  77. return 0;
  78. }

07388950edde4b1ba9fc4e28c819fd85.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/553874
推荐阅读
相关标签
  

闽ICP备14008679号