Json在工作中的使用总结

为什么要用Json

在我之前学习以及自己写项目的过程中,都是很麻烦的采用手动的将字节信息或者格式化信息进行手动序列化与手动反序列化。这样做的坏处相当多,比如要考虑各种类型强制转化的问题,分隔符划分还是等长划分的问题,粘包问题等等,在这样的前提下,我来到公司实习发现了一种对于这样字节流格式数据的序列化与反序列化的完美格式:Json。

公司接触到的项目中,大致是在一个服务中管理三个工作线程,分别从某数据处理转换跟踪系统,动态和Detour系统中传输数据,当中用到HTTP协议(Body中)和从消息队列中消费数据,这样的数据都是需要序列化和反序列化传输,所以普遍用到Jsoncpp这个库来进行合理操作。

Jsoncpp的Linux安装

参考这位同学的博客,精炼实用:https://www.cnblogs.com/wuli-jishu-192-168-23333/p/6215532.html

Jsoncpp的使用
  1. string格式 转换为 Json格式
	  1 #include <iostream>
  2 #include <string>
  3 #include "json/reader.h"
  4 #include "json/writer.h"
  5 #include "json/value.h"
  6 
  7 struct ID_Message {
  8   std::string Country;
  9   std::string City;
 10   std::string Addr;
 11   std::string Name;
 12   int         Age;
 13 };
 14 
 15 int main()
 16 {
 17   std::string json_test("{\"Country\":\"China\",\"City\":\"Beijing\",\"Addr\":\"Haidian\",\"Name\":\"liuzhengkai\",\"Age\":21");                                                                           
 18 
 19   // 首先测试将其构造成一条json数据
 20   Json::Reader reader;
 21   Json::Value   value;
 22 
 23   if (!reader.parse(json_test, value)) {
 24     std::cout<<"Json::Reader parse failed"<<std::endl;
 25     return 1;
 26   }
 27 
 28   std::cout<<value["Country"].asString()<<\
 29     " "<<value["City"].asString()<<" "<<value["Addr"].asString()<<" "<<value["Name"].asString()<<" "<<value["Age"].asInt()<<std::endl;
 30 
 31   // 测试json数据格式转化为string类型
 32   Json::Value val;
 33   struct ID_Message im;
 34   im.Country = value["Country"].asString();
 35   im.City    = value["City"].asString();
 36   im.Addr    = value["Addr"].asString();
 37   im.Name    = value["Name"].asString();
 38   im.Age     = value["Age"].asInt();
 39 
 40   std::cout<<"ID_Message : "<<im.Country<<" "<<im.City<<" "<<im.Addr<<" "<<im.Name<<" "<<im.Age<<std::endl;
 42
 43   return 0;
 44 }

运行结果:

[lzk@localhost Json_About]$ ./a.out 
China Beijing Haidian liuzhengkai 21
ID_Message : China Beijing Haidian liuzhengkai 21
  • Json格式 转化为 string格式
  1 #include <iostream>
  2 #include <string>
  3 #include "json/reader.h"
  4 #include "json/writer.h"
  5 #include "json/value.h"
  6 
  7 struct ID_Message {
  8   std::string Country;
  9   std::string City;
 10   std::string Addr;
 11   std::string Name;
 12   int         Age;
 13 };
 14 
 15 int main()
 16 {
 17   std::string json_test("{\"Country\":\"China\",\"City\":\"Beijing\",\"Addr\":\"Haidian\",\"Name\":\"liuzhengkai\",\"Age\":21");                                                                           
 18 
 19   // 首先测试将其构造成一条json数据
 20   Json::Reader reader;
 21   Json::Value   value;
 22 
 23   if (!reader.parse(json_test, value)) {
 24     std::cout<<"Json::Reader parse failed"<<std::endl;
 25     return 1;
 26   }
 27 
 28   std::cout<<value["Country"].asString()<<\
 29     " "<<value["City"].asString()<<" "<<value["Addr"].asString()<<" "<<value["Name"].asString()<<" "<<value["Age"].asInt()<<std::endl;
 30 
 31   // 测试json数据格式转化为string类型
 32   Json::Value val;
 33   struct ID_Message im;
 34   im.Country = value["Country"].asString();
 35   im.City    = value["City"].asString();
 36   im.Addr    = value["Addr"].asString();
 37   im.Name    = value["Name"].asString();
 38   im.Age     = value["Age"].asInt();
 39 
 40   std::cout<<"ID_Message : "<<im.Country<<" "<<im.City<<" "<<im.Addr<<" "<<im.Name<<" "<<im.Age<<std::endl;
 41 
 42   val["Country"] = im.Country;
 43   val["City"]    = im.City;
 44   val["Addr"]    = im.Addr;
 45   val["Name"]    = im.Name;
 46   val["Age"]     = im.Age;
 47   std::string json_res = val.toStyledString();
 48   std::cout<<"json to string : "<<json_res<<std::endl;
 49 
 50   return 0;
 51 }

运行结果:

[lzk@localhost Json_About]$ ./a.out 
China Beijing Haidian liuzhengkai 21
ID_Message : China Beijing Haidian liuzhengkai 21
json to string : {
   "Addr" : "Haidian",
   "Age" : 21,
   "City" : "Beijing",
   "Country" : "China",
   "Name" : "liuzhengkai"
}

其他相关

除此之外,Json还有更加强大的支持类似数组的形式,一般喜欢在需要传输的元素中加上一个 num 代表当前是循环中的第几个元素字段,解析起来会更加方便,文中就不提供相关Demo。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值