目录
Boost的1.75版本新库
12月11日,Boost社区发布了1.75版本,相比较于原定的12月9日,推迟了两天。这次更新带来了三个新库:JSON
,LEAF
,PFR
。
其中JSON
自然是json格式的解析库,来自Vinnie Falco
和Krystian Stasiowski
。
LEAF
是一个轻量的异常处理库,来自Emil Dotchevski
。
PFR
是一个基础的反射库,不需要用户使用宏和样版代码(由于还未仔细阅读此库,可能翻译有一些不准确),来自Antony Polukhin
。
JSON库简介
其实在之前,Boost
就已经有能够解析JSON的库了,名字叫做Boost.PropertyTree
。Boost.PropertyTree
不仅仅能够解析JSON
,还能解析XML
,INI
和INFO
格式的文件。但是由于成文较早及需要兼容其他的数据格式,相比较于其他的C++
解析库,其显得比较笨重,使用的时候有很多的不方便。
Boost.JSON
相对于Boost.PropertyTree
来所,其只能支持JSON
格式的解析,但是其使用方法更为简便,直接。华丽胡哨的东西也更多了。
JSON的简单使用
有两种方法使用Boost.JSON
,一种是动态链接库,此时引入头文件boost/json.hpp
,同时链接对应的动态库;第二种是使用header only模式,此时只需要引入头文件boost/json/src.hpp
即可。两种方法各有优缺点,酌情使用。
编码
最通用的方法
我们要构造的json如下,包含了各种类型。
{
"a_string" : "test_string",
"a_number" : 123,
"a_null" : null,
"a_array" : [1, "2", {"123" : "123"}],
"a_object" : {
"a_name": "a_data"
},
"a_bool" : true
}
构造的方法也很简单:
boost::json::object val;
val["a_string"] = "test_string";
val["a_number"] = 123;
val["a_null"] = nullptr;
val["a_array"] = {
1, "2", boost::json::object({{"123", "123"}})
};
val["a_object"].emplace_object()["a_name"] = "a_data";
val["a_bool"] = true;
首先定义一个object
,然后往里面塞东西就好。其中有一个emplace_object
这个比较重要,后面会提到。
结果:
使用std::initializer_list
Boost.JSON
支持使用std::initializer_list
来构造自己的对象。所以也可以这样使用:
boost::json::value val2 = {
{"a_string", "test_string"},
{"a_number", 123},
{"a_null", nullptr},
{"a_array", {1, "2", {{"123", "123"}}}},
{"a_object", {{"a_name", "a_data"}}},
{"a_bool", true}
};
结果如下:
json对象的输出
生成了json
对象以后,就可以使用serialize
对对象进行序列化了。
std::cout << boost::json::serialize(val2) << std::endl;
结果如前两图。
除了直接把整个对象直接输出,Boost.JSON
还支持分部分进行流输出,这种方法在数据量较大时,可以有效降低内存占用。
boost::json::serializer ser;
ser.reset(&val);
char temp_buff[6];
while (!ser.done()) {
std::memset(temp_buff, 0, sizeof(char) * 6);
ser.read(temp_buff, 5);
std::cout << temp_buff << std::endl;
}
结果:
如果缓存变量是数组,还可以直接使用ser.read(temp_buff)
。
需要注意的是,ser.read
并不会默认在字符串末尾加