2011-07-01 33 views
8
{ 
    "menu": 
    { 
     "foo": true, 
     "bar": "true", 
     "value": 102.3E+06, 
     "popup": 
     [ 
      {"value": "New", "onclick": "CreateNewDoc()"}, 
      {"value": "Open", "onclick": "OpenDoc()"}, 
     ] 
    } 
} 

どのようにしてonclickの値を取得できますか? menu.popupノードの子を介しboost :: property_treeを使用してJSON配列にアクセスするにはどうすればよいですか?

+0

「onclick」と呼ばれるものが2つあります。あなたはどちらを使いたいのですか? –

+2

これは今日Boost.PropertyTreeに関する3番目の質問です。それはかなりの[まともな文書](http://www.boost.org/doc/libs/1_46_1/doc/html/property_tree.html)を持っています。おそらくあなたはそれを読むべきです。 –

+3

@Nicol - ちょっと皮肉なことに、OPの例は実際Boostのドキュメントです! http://www.boost.org/doc/libs/1_41_0/doc/html/boost_propertytree/parsers.html#boost_propertytree.parsers.json_parser – Perception

答えて

16

反復および抽出onclick値:

void print_onclick_values(const ptree& node) 
{ 
    BOOST_FOREACH(const ptree::value_type& child, 
        node.get_child("menu.popup")) { 
     std::cout 
      << "onclick: " 
      << child.second.get<std::string>("onclick") 
      << "\n"; 
    } 
} 

機能プリント:

onclick: CreateNewDoc() 
onclick: OpenDoc() 

N.B.例から末尾のカンマを削除します。

{"value": "Open", "onclick": "OpenDoc()"}, 

あなたは、単一のget<string>(path)またはget_child(path)コールを使用して、配列の特定の子にアクセスすることはできません。 The manual says:同じキーが指定されていない選択された子を複数回、表示された場合

は、パスに応じて、各レベルで結果が、すなわち、完全に確定的ではないかもしれません。これにより、このパスの子孫があっても解決されないパスにつながる可能性があります。例:

a -> b -> c 
    -> b 

パス「A.B.C」「B」の解像度が最初のようなノードを選択した場合に成功し、それは第二の選択した場合に失敗します。

JSON配列の要素はすべて、名前として空の文字列を持ちます。あなたは

void print_arbitrary_onclick_value(const ptree& node) 
{ 
    std::cout << node.get<std::string>("menu.popup..onclick") << "\n"; 
} 

onclick値配列の要素にアクセスすることができますが、onclickのアクセスが試行された要素のために知りません。

+0

このように、私たちはそれを得ることができます。しかし、私はpt.getステートメントのパスを取得したい。 – wyz365889

+0

@ wyz365889できません。私は私の答えを更新しました。 – antonakos

+0

ええと。これと同じように、私はそれを手に入れることができませんが、jsoncppを使ってJSON配列にアクセスすれば、jsonのパスを介して取得できます。だから私はpt.getステートメントの道を通ってそれを得ることができると思う。しかし、私は何をすべきか分からない。文字列s = "{\" age \ ":26、\" person \ ":\" id \ ":1、\" study \ ":\" language \ ":\" Chinese \ "} \ "name \":\ "chen \"}、{\ "id \":2、\ "name \":\ "zhang \"}] 、\ "name \":\ "huchao \"} "; ptree pt; ストリングストリーム(streamstream)ストリーム。 read_json (stream、pt); 文字列s2 = pt.get ( "person。" "study。[1]。); cout << s2 << endl; – wyz365889

関連する問題