web-dev-qa-db-ja.com

ブーストプロパティツリーを使用してint配列を読み取る

次のように、いくつかの整数配列変数を持つJSONがあります。

{"a": [8, 6, 2], "b": [2, 2, 1]}

たとえば、boost property_treeを使用したいと思います。

std::stringstream ss;
boost::property_tree::ptree pt;

ss << "{\"a\": [8, 6, 2], \"b\": [2, 2, 1]}";

boost::property_tree::read_json(ss, pt);
std::vector<int> a = pt.get<std::vector<int> >("a");

これは機能せず、私が試したintポインターのバリエーションも機能しません。プロパティツリーから配列を読み取るにはどうすればよいですか?

27
Larry

JSONサポートは、プロパティツリーのブーストではむらがあります。

プロパティツリーデータセットは型指定されておらず、配列自体をサポートしていません。したがって、次のJSON /プロパティツリーマッピングが使用されます。

  • JSONオブジェクトはノードにマップされます。各プロパティは子ノードです。
  • JSON配列はノードにマップされます。各要素は、空の名前を持つ子ノードです。ノードに名前付き子ノードと名前なし子ノードの両方がある場合、JSON表現にマップできません。
  • JSON値は、値を含むノードにマップされます。ただし、すべてのタイプ情報は失われます。数字、およびリテラル「null」、「true」、「false」は、単に文字列形式にマッピングされます。
  • 子ノードとデータの両方を含むプロパティツリーノードはマップできません。

ドキュメント から)

ヘルパー関数を使用して配列を繰り返すことができます。

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

using boost::property_tree::ptree;

template <typename T>
std::vector<T> as_vector(ptree const& pt, ptree::key_type const& key)
{
    std::vector<T> r;
    for (auto& item : pt.get_child(key))
        r.Push_back(item.second.get_value<T>());
    return r;
}

int main()
{
    std::stringstream ss("{\"a\": [8, 6, 2], \"b\": [2, 2, 1]}");

    ptree pt;
    read_json(ss, pt);

    for (auto i : as_vector<int>(pt, "a")) std::cout << i << ' ';
    std::cout << '\n';
    for (auto i : as_vector<int>(pt, "b")) std::cout << i << ' ';
}

ご覧くださいLive On Colir出力:

8 6 2 
2 2 1
24
sehe

次のようにaリストを読み取ります。

#include <boost/foreach.hpp>
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.")) {
    cout << v.second.data() << endl;
}
13
Derek Illchuk