Using boost property tree to read int array

前端 未结 2 1902
甜味超标
甜味超标 2020-12-29 04:30

I have some JSON with a handful of integer array variables, like so:

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

I would like to use boost propert

相关标签:
2条回答
  • 2020-12-29 05:01

    Read your a list as follows:

    #include <boost/foreach.hpp>
    BOOST_FOREACH(boost::property_tree::ptree::value_type &v, pt.get_child("a.")) {
        cout << v.second.data() << endl;
    }
    
    0 讨论(0)
  • 2020-12-29 05:15

    JSON support, is spotty with boost property tree.

    The property tree dataset is not typed, and does not support arrays as such. Thus, the following JSON / property tree mapping is used:

    • JSON objects are mapped to nodes. Each property is a child node.
    • JSON arrays are mapped to nodes. Each element is a child node with an empty name. If a node has both named and unnamed child nodes, it cannot be mapped to a JSON representation.
    • JSON values are mapped to nodes containing the value. However, all type information is lost; numbers, as well as the literals "null", "true" and "false" are simply mapped to their string form.
    • Property tree nodes containing both child nodes and data cannot be mapped.

    (from the documentation)

    You can iterate the array with a helper function.

    #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 << ' ';
    }
    

    See it Live On Coliru. Output:

    8 6 2 
    2 2 1
    
    0 讨论(0)
提交回复
热议问题