2011-04-14 66 views
8

的元素這應該是簡單的(我只是學習提升,所以我失去了一些東西)升壓:只是遍歷一個ptree中

我一直在使用json_read在一些簡單的JSON閱讀和現在有一個ptree中。網絡上的所有示例都使用ptree.get(「entry_name」)獲取條目。所有我想要做的是一樣的東西:

ptree pt; 
read_json(ss,pt); 

BOOST_FOREACH(ptree::value_type &v, pt) 
{ 
    std::cout << v.{entry_name} << v.{value} 
} 

即通過ptree中環和寫出來的每一個名字(即你投入pt.get())和它的相應的值。

很抱歉,如果這是簡單的

羅斯

回答

2

我在與ptree中的煩惱爲好,但也許這可以幫助: 退房boost's ptree quick tutorial

V {} ENTRY_NAME
。 將是
v.first

訴{}價值
v.second.data()

將這項工作?

13

我在找同樣的東西,並且找不到答案。它被證明是確實相當簡單:

ptree pt; 
/* load/fill pt */ 
for(iterator iter = pt.begin(); iter != pt.end(); iter++) 
{ 
    std::cout << iter->first << "," << iter->second.data() << std::endl; 
} 

iter->第一個是輸入的名稱,iter-> second.data()是第一級的入賬價值。 (然後,您可以用iter-> second.begin()/ end()重新迭代以獲得更深的級別。)

此外,如果此迭代中的一個此類節點不是終端節點並且本身是ptree,那麼您可以從這個迭代器本身獲得ptree: ptree subPt = iter-> second.get_child(「nodeName」);

感謝您爲我提供了一個理解它的方向,ptree現在看起來非常直觀,就像其他C++ stl函數一樣。

+0

其舊帖子和來不及評論,但如果iter-> second.data()是一個數組,該代碼將無法正常工作,是nt嗎? – LearningCpp 2017-05-04 08:05:17

+0

沒錯,但是如果你閱讀下面的代碼文本,就會解釋如何處理非終端。 – 2017-05-20 16:02:53

0

這裏有一個如何使用正常的「獲取」功能,看一下例子,從推動循環使用BOOST_FOREACH http://akrzemi1.wordpress.com/2011/07/13/parsing-xml-with-boost/

直接訪問ptree中一個很好的例子: http://www.boost.org/doc/libs/1_51_0/doc/html/boost_propertytree/tutorial.html

的文檔頁面所在這裏: http://www.boost.org/doc/libs/1_51_0/doc/html/boost/property_tree/basic_ptree.html 我知道它沒有很好的記錄,但它是有幫助的。

0

本示例遍歷一個簡單的JSON對象並將其值放入一個向量中。

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/json_parser.hpp> 
#include <boost/lexical_cast.hpp> 

#include <iostream> 
#include <string> 
#include <vector> 
#include <sstream> 

int main (void) 
{ 
    try 
    {   
     std::stringstream ss; 
     std::string json_obj_str = "{ \"unit_1\": 1, \"unit_2\": 2, \"unit_3\": 3 }"; 
     std::vector <float> fvec; 

     ss << json_obj_str; // put string into stringstream 

     boost::property_tree::ptree pt; 
     boost::property_tree::read_json(ss, pt); // put stringstream into property tree 

     // iterate over JSON properties 
     for (boost::property_tree::ptree::iterator iter = pt.begin(); iter != pt.end(); iter++) 
     { 
      std::cout << iter->first << ": " << iter->second.data() << std::endl; 
      fvec.push_back(boost::lexical_cast<float>(iter->second.data())); 
     } 

     for (size_t i = 0; i < fvec.size(); i++) 
     { 
      std::cout << "fvec.at(" << i << ") = " << fvec.at(i) << std::endl; 
     } 
    } 
    catch (const boost::property_tree::ptree_error &e) 
    { 
     std::cerr << "property_tree error = " << e.what() << std::endl; 
     return -2; 
    }  
    catch (std::exception const& e) 
    { 
     std::cerr << "exception = " << e.what() << std::endl; 
     return -1; 
    } 

    return 0; 
}