使用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" |