2015-08-08 106 views
1

我知道如何解析「正常」看JSON數據在C++。通常,我這樣做,使用boost::property_treeread_json方法。它可能看起來像這樣:如何使用C++解析json內部的嵌套數組

BOOST_FOREAH(ptree::value_type &v, pt.get_child("rows"){ 
    vec.push_back(v.second.get<std::string>("key")); 
} 

和上面的代碼對應於這個JSON文件:

{ 
    "rows":[{ 
     "key":"1" 
    },{ 
     "key":"2" 
    }] 
} 

然而,Neo4j結果集,我得到的,是這樣的:

{ 
    "columns":{...}, 
    "data":[[["object 1"]], [["object 2"]], [["object 3"]]] 
} 

我很感興趣,並且想分析"data"節點。我試圖這樣做:

BOOST_FOREAH(ptree::value_type &v, pt.get_child("data"){ 
    vec.push_back(v.second.data()); 
} 

但這不起作用。我沒有收到錯誤信息,但我的矢量vec仍爲空,或者更確切地說它是填充空值的。所以,當我遍歷這個vec時,我看到了一些元素,但它們沒有任何價值。鑑於,我想要價值"object 1","object 2","object 3"

+0

https://github.com/jeaye/jeayeson,json_spirit,來命名這兩個庫。 –

+0

這些庫看起來很有前途,但是你100%確定它們會解析我的json文件嗎? – Jacobian

+1

@Jacobian如果庫聲明它支持解析標準的JSON,那麼它將解析標準的JSON,否則它是錯誤的。或者你的問題不清楚。 –

回答

1

該解決方案是這樣的:

using boost::property::ptree; 
ptree pt; 
//... populate ptree pt with data from some source 
BOOST_FOREACH(ptree::value_type &v, pt.get_child('data')){ 
    ptree subtree1 = v.second; 
    BOOST_FOREACH(ptree::value_type &vs, subtree1){ 
     ptree subtree2 = vs.second; 
     BOOST_FOREACH(ptree::value_type &vs2, subtree2){ 
      do_something(vs2.second.data()); 
     } 
    } 
} 

這個代碼能夠這樣JSON結構解析:

{ 
"data":[[["object 1"]], [["object 2"]], [["object 3"]]] 
} 

所以,相反,一些人在說些什麼,其實,沒有需要使用其他第三方庫。只需使用boost即可完成。

+0

雖然,我不喜歡這個代碼。我希望有一些簡化。因爲,複製粘貼'BOOST_FOREACH'看起來相當技術性。 – Jacobian

+0

確實。對於第三方庫通常不需要*。雖然你很幸運,但這可以滿足你的需求。祝你好運,如果你需要格式化正確的JSON號碼。這就是爲什麼更糟糕的是將Boost Property Tree作爲JSON庫進行宣傳。 – sehe