3

私は過去 2 日間、C++ で次のことを行う方法を見つけようと試みてきました。

私はjson文字列を持っています:

[
     {
       "pid" : 0,
       "nick":"Foo",
       "score":12,
       "ping":50
     },
     {
       "pid":1,
       "nick":"Bar",
       "score":23,
       "ping":24
     }
]

これらすべての子を反復処理し、たとえば、PlayerID の値を a に入れstd::vectorて、それらすべてを返すことができるようにしたいと考えています。

私が立ち往生している場所はここにあります:

// some code
boost::property_tree::ptree pt;
boost::property_tree::read_json(ss, pt);

std::vector<int> players;
int pid;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("pid")) // I also tried with pt or pt.get_child("")
{
    pid = v.second.data();
    players.push_back(pid);
}
return players;

ドキュメントを見ましたが、良いものが見つかりませんでした。また、私はそこにあるほとんどすべてを試しましたが、エラーなしでコンパイルされた場合、 what() 期待されるオブジェクトまたはそのようなものが得られます。私は本当に立ち往生しています、どんな助けも大歓迎です! 前もって感謝します。

4

1 に答える 1

4

PropertyTree の JSON サポートは型指定されていません - data() は常に文字列を返します。

JSON を解析して得られる PTree は、配列要素ごとに 1 つの名前のない子を持つルート ノードで構成されている必要があります。これらの子にはそれぞれ、値の名前付きの子が 4 つあります。それを繰り返すコードは次のようになります。

namespace bpt = boost::property_tree;
bpt::ptree pt;
bpt::read_json(ss, pt);

std::vector<int> players;
int pid;

BOOST_FOREACH(bpt::value_type& v, pt) { // iterate over immediate children of the root
  pid = v.second.get<int>("pid"); // use the converting path getter
  players.push_back(pid);
}
于 2013-06-13T12:21:44.133 に答える