2012-05-16 64 views
2

我試圖使用in this question所示的方法從boost::property_tree讀取陣列數據。在這個例子中,數組首先作爲字符串讀取,轉換爲字符串流,然後讀入數組。在實施這個解決方案時,我注意到我的字符串已經空了。來自boost :: property_tree的讀取數組爲空白

實施例輸入(JSON):

"Object1" 
{ 
    "param1" : 10.0, 
    "initPos" : 
    { 
    "":1.0, 
    "":2.0, 
    "":5.0 
    }, 
    "initVel" : [ 0.0, 0.0, 0.0 ] 
} 

這些陣列符號的兩個被解釋爲通過升壓JSON分析器陣列。我確信數據在屬性樹中存在,因爲在調用json writer時,數組數據出現在輸出中。

這就是失敗的例子:

std::string paramName = "Object1.initPos"; 
tempParamString = _runTree.get<std::string>(paramName,"Not Found"); 
std::cout << "Value: " << tempParamString << std::endl; 

paramName"Object1.param1"我得到「10.0」輸出作爲一個字符串, 當paramName"Object1.initPos"我得到一個空字符串, 如果paramName是什麼那在樹中不存在,"Not Found"被返回。

+0

未知的,如果它是相關的,但我使用升壓1.49.0 – 2NinerRomeo

回答

0

首先,確保提供的JSON有效。它看起來有一些問題。 接下來,您無法將Object1.initPos作爲字符串獲取。它的類型是boost :: property_tree :: ptree。您可以使用get_child獲取並處理它。

#include <algorithm> 
#include <string> 
#include <sstream> 

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

using namespace std; 
using namespace boost::property_tree; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    try 
    { 
     std::string j("{ \"Object1\" : { \"param1\" : 10.0, \"initPos\" : { \"\":1.0, \"\":2.0, \"\":5.0 }, \"initVel\" : [ 0.0, 0.0, 0.0 ] } }"); 
     std::istringstream iss(j); 

     ptree pt; 
     json_parser::read_json(iss, pt); 

     auto s = pt.get<std::string>("Object1.param1"); 
     cout << s << endl; // 10 

     ptree& pos = pt.get_child("Object1.initPos"); 
     std::for_each(std::begin(pos), std::end(pos), [](ptree::value_type& kv) { 
      cout << "K: " << kv.first << endl; 
      cout << "V: " << kv.second.get<std::string>("") << endl; 
     }); 
    } 
    catch(std::exception& ex) 
    { 
     std::cout << "ERR:" << ex.what() << endl; 
    } 

    return 0; 
} 

輸出:

10.0 
K: 
V: 1.0 
K: 
V: 2.0 
K: 
V: 5.0 
相關問題