为什么要用Json
在我之前学习以及自己写项目的过程中,都是很麻烦的采用手动的将字节信息或者格式化信息进行手动序列化与手动反序列化。这样做的坏处相当多,比如要考虑各种类型强制转化的问题,分隔符划分还是等长划分的问题,粘包问题等等,在这样的前提下,我来到公司实习发现了一种对于这样字节流格式数据的序列化与反序列化的完美格式:Json。
公司接触到的项目中,大致是在一个服务中管理三个工作线程,分别从某数据处理转换跟踪系统,动态和Detour系统中传输数据,当中用到HTTP协议(Body中)和从消息队列中消费数据,这样的数据都是需要序列化和反序列化传输,所以普遍用到Jsoncpp这个库来进行合理操作。
Jsoncpp的Linux安装
参考这位同学的博客,精炼实用:https://www.cnblogs.com/wuli-jishu-192-168-23333/p/6215532.html
Jsoncpp的使用
- 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。