2017-05-01 102 views
3

我試圖使用Boost的property tree來解析JSON文件。這裏是JSON文件使用Boost讀取JSON property_tree

{ 
    "a": 1, 
    "b": [{ 
     "b_a": 2, 
     "b_b": { 
      "b_b_a": "test" 
     }, 
     "b_c": 0, 
     "b_d": [{ 
      "b_d_a": 3, 
      "b_d_b": { 
       "b_d_c": 4 
      }, 
      "b_d_c": "test", 
      "b_d_d": { 
       "b_d_d": 5 
      } 
     }], 
     "b_e": null, 
     "b_f": [{ 
      "b_f_a": 6 
     }], 
     "b_g": 7 
    }], 
    "c": 8 
} 

和MWE

#include <iostream> 
#include <fstream> 

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

namespace pt = boost::property_tree; 

using namespace std; 

int main() 
{ 

    boost::property_tree::ptree jsontree; 
    boost::property_tree::read_json("test.json", jsontree); 

    int v0 = jsontree.get<int>("a"); 
    int v1 = jsontree.get<int>("c"); 
} 

問題我現在知道如何閱讀最外面的變量ac。但是,我很難讀取其他級別,如b_a, b_b_a, b_d_a等。我如何用Boost來做到這一點?我不一定要尋找一個涉及循環的解決方案,只是試圖弄清楚如何「提取」內部變量。

我很樂意使用其他庫,如果他們是最佳的。但是到目前爲止,Boost看起來對我很有希望。

+0

您可以使用「。」分隔符來指定路徑到嵌套節點,比如'jsontree.get (「b.b_b.b_b_a」)' – zett42

+1

對於JSON,我通常會推薦兩種可能性之一。如果你像REST服務器那樣需要以儘可能快的速度對大量JSON進行操作,那麼你需要[RapidJSON](https://github.com/miloyip/rapidjson)。幾乎所有的事情,你可能都想要[Nlohmann的JSON庫](https://github.com/nlohmann/json)。 –

+0

@ zett42我試過了,我收到一個錯誤:'拋出'boost :: exception_detail :: clone_impl >實例後終止調用' ():沒有這樣的節點(b.b_b.b_b_a)' – BillyJean

回答

1

要獲取嵌套元素,您可以使用路徑語法,其中每個路徑組件由"."分隔。事情在這裏有點複雜,因爲子節點b是一個數組。所以你不能沒有循環。

const pt::ptree& b = jsontree.get_child("b"); 
for(const auto& kv : b){ 
    cout << "b_b_a = " << kv.second.get<string>("b_b.b_b_a") << "\n";  
} 

Live demo at Coliru.

我還添加代碼打印整個樹遞歸,所以你可以看到JSON如何被翻譯成ptree中。數組元素被存儲爲鍵/值對,其中鍵是空字符串。

相關問題