簡體   English   中英

使用Boost property_tree讀取JSON

[英]Reading JSON with Boost property_tree

我正在嘗試使用Boost的property tree來解析JSON文件。 這是JSON文件

{
    "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看起來很有希望。

要獲取嵌套元素,可以使用路徑語法,其中每個路徑組件由"."分隔"." 這里的事情有點復雜,因為子節點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";    
}

在Coliru現場演示。

我還添加了代碼來遞歸打印整個樹,這樣你就可以看到JSON如何被轉換為ptree。 數組元素存儲為鍵/值對,其中鍵是空字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM