使用boost::property_tree解析xml与json (三):parse_json设计
请注意,这段代码只能运行在
boost的版本比较高的情况下。我的ubuntu 14.04LTS的boost版本是1.54,所以能编译通过,但是今天我在我的centos 6.5上编译通不过,因为我的centos 6.5的boost版本是1.41。我在centos 6.5下是用yum安装boost的命令是
1 | yum -y groupinstall "Development Tools" |
然而这个yum -y install boost-*在我的zsh环境下执行不了,我只好切换到bash执行。boost安装路劲是/usr/include/boost,然后有一个专门的version.hpp是显示boost版本的,这个时候我查看到我用yum安装的boost是1.41版本。随后我重新下载了boost的源代码,使用b2安装了最新版。不得不说centos的软件更新速度真是慢。同样是安装,我的Ubuntu 14.04LTS用的是
1 | sudo apt-get install libboost-all-dev |
安装的boost就是1.54版本。
=========================== 2015年12月13日 ========================================
解析json由于没有attribute,相比解析xml少了很多繁文缛节。把这篇博客和我上一篇博客《使用boost::property_tree解析xml与json (二):parse_xml设计》对比起来看理解起来会很容易。
想法
解析json,我觉得有以下几种情况:
根据json的key直接获取value
接口是这样子的:
1 | string GetChildData(const string& path); |
比如说这样的一个json:
1 | { |
使用:
1 | pt.GetChildData("root.child.a") |
就能获取到a的值。
获取一个json下所有的key-value
在上面的例子当中,就是获取root.child下面的a和b。
接口为:
1 | map<string, string> GetChildDataMap(const string& path); |
由于json的格式都是key-value型,使用map简直是最适合不过了。唯一需要注意的就是同一个元素当中不能有相同的key,否则写到map 当中会覆盖掉原来的值,这种情况我觉的大可不必担心,因为在写json配置文件的时候自然会考虑到不能写重复的key值,所以我在这里用的是map而不是mutilmap。
1 | pt.GetChildData("root.child") |
获取json的数组
接口格式是这样:
1 | vector<map<string, string> > GetChildDataArray(const string& path); |
如果想要获取child这个数组的话:
1 | { |
使用方法为
1 | pt.GetChildDataArray("root.child") |
刚刚好child这个数组的每一个元素都没有名字,vector也不保存名字。而数组的每个元素当中的key-value刚刚好就是一个pair。
插入数据的操作
插入一个key-value
使用
1 | void PutChildData(const string& key, const string& value); |
比如要在
1 | { |
当中插入一行key-value,就可以用这个接口
1 | pt.PutChildData("testput", "testput") |
最后得到:
1 | { |
这个接口当中封装的property_tree方法会自动添加逗号。
插入一个map
与上面的
1 | map<string, string> GetChildDataMap(const string& path); |
相对应的就是这个接口:
1 | void PutChildDataMap(const string& key, const map<string, string>& key_value_map); |
比如要在当中加入一个和child相同的map:
1 | { |
使用方法:
1 | myMap.insert(make_pair("a", "1")); |
运行结果为:
1 | { |
插入一个数组
同样的和上面的get接口相对应的put接口:
1 | void PutChildDataArray(const string& key, const vector<map<string, string> >& array_list); |
比如对这个json进行操作:
1 | { |
使用方法:
1 | myMap.insert(make_pair("a", "1")); |
运行结果为:
1 | { |
保存结果
在对json进行写入之后,不要忘记调用接口
1 | void SaveConfig(); |
来保存结果。
这个和xml的操作是一样的。
我的测试详情请访问test_json.cpp
贴上完整的源代码:
parse_json.h
1 | #ifndef MQUEUE_INCLUDE_PARSE_JSON_H_ |
parse_json.cpp
1 | #include "MQueue/parse_json.h" |
