Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost属性树读取int数组_C++_Json_Boost_Boost Propertytree - Fatal编程技术网

C++ 使用boost属性树读取int数组

C++ 使用boost属性树读取int数组,c++,json,boost,boost-propertytree,C++,Json,Boost,Boost Propertytree,我有一些JSON和一些整数数组变量,如下所示: {"a": [8, 6, 2], "b": [2, 2, 1]} 我想使用boost属性树,例如: 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 =

我有一些JSON和一些整数数组变量,如下所示:

{"a": [8, 6, 2], "b": [2, 2, 1]}
我想使用boost属性树,例如:

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");
std::stringstream-ss;
boost::property_tree::ptree pt;

ssJSON支持,与boost属性树不一致

属性树数据集不是类型化的,因此不支持数组。因此,使用了以下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 << ' ';
}

阅读您的
a
列表,如下所示:

#include <boost/foreach.hpp>
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.")) {
    cout << v.second.data() << endl;
}
#包括
BOOST\u FOREACH(BOOST::property\u tree::ptree::value\u type&v,pt.get\u child(“a”)){

这个问题的答案不可能重复,因为它没有涵盖数组的具体情况,所以我不同意。顺便说一句,这个问题的答案即将给出。但是这个问题本身有处理数组的代码,示例数据中有一个数组。他使用循环提取元素。哦,我明白你的意思了所问的问题包含了我问题的答案。不过,我觉得这并不明显。直觉上,直接解析基元数组对我来说是有意义的。对我问题的简明回答应该是“基元类型数组中的每个元素都是子节点的特例”漂亮的解决方案。有人能给出使用boost_foreach的示例代码吗?-我不能在我的项目中使用C++11。路径中的尾随
非常优雅。+1来自我
#include <boost/foreach.hpp>
BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.")) {
    cout << v.second.data() << endl;
}