c++ ptree判断是否存在节点_新人报道献礼:关于boost property_tree的一些探讨
本人最近工作中要用到c++解析json的方法,故在網上查了不少文章進行學習。
先發點牢騷:找了很多文章,但感覺多數內容雷同,深度不夠,缺乏自己的分析和稍微深入一些的見解。
然后要感謝下面這2篇文章的作者:
http://www.voidcn.com/article/p-smrzeuyb-bud.html
http://einverne.github.io/post/2016/01/boost-learning-note-7.html
花了大約2-3個小時的時間仔細學習了一下,改寫出了下面的一段測試代碼:
#include
#include
#include
using namespace boost::property_tree;
using namespace std;
void test1_2(){
//http://www.voidcn.com/article/p-smrzeuyb-bud.html
std::string const sample = R"(
{
"background": {
"scripts": [ "name1.js", "name2.js", "name3.js" ]
},
"default_popup": "popup.html",
"default_title": "__MSG_name__",
"content_scripts": [ {
"all_frames": true,
"js": [ "name4.js", "name5.js", "name6.js" ],
"match_about_blank": true,
"matches": [ "http://*/*", "https://*/*" ],
"run_at": "document_start"
}, {
"all_frames": true,
"js": [ "include.postload.js" ],
"match_about_blank": true,
"matches": [ "http://*/*", "https://*/*" ],
"run_at": "document_end"
} ]
})";
//printf("sample=%s\n",sample.c_str());
ptree pt;
stringstream stream1(sample);
read_json(stream1,pt);
struct temp_fxn1 {
//ref: basic_ptree public member functions
static int ptree_type(const ptree &pt){
if(pt.size()>0){
if(pt.begin()->first==""){
return 1;//array
}else{
return 2;//object
}
}else{
return 0;//leaf
}
}
};
//遍歷
//for(auto &e : pt){
//故意這樣寫:ref http://einverne.github.io/post/2016/01/boost-learning-note-7.html
for(boost::property_tree::ptree::iterator it = pt.begin(); it != pt.end(); ++it){
auto &e=*it;
printf("===>\n");
std::cout << e.first << ',' << e.second.get_value<:string>()<
printf("~~~~>\n");
for(auto &c : e.second){
std::cout << c.first << "\n";
}
}
}
這段代碼實現了解析任意json字符串的功能(不包括出錯處理),其中temp_fxn1::ptree_type()函數用于判斷一個ptree節點類型。
注1:在解析json str是,只要str本身符合json的預壓就可以生成一顆ptree,并不需要知道json str里面具體有哪些字段。這是多數文章未解決的問題。
注2:本人不喜歡 for(auto &e : pt){...}以及 BOOST_FOREACH 這樣的寫法。
致c++初學者:建議仔細走讀一下這段程序,本人雖然水平不高,但還是花了不少心思的。這段代碼里面包含了不少c++的知識點。
本人從事c++編碼20余年,居然不知道R"..."這樣的寫法,實在慚愧。看來大家在一起交流是很重要的。
總結
以上是生活随笔為你收集整理的c++ ptree判断是否存在节点_新人报道献礼:关于boost property_tree的一些探讨的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3项目里面全局用less变量 cli v
- 下一篇: oracle开放查询表权限_oracle