简体   繁体   English

访问ptree数组中的特定索引

[英]Access to specific index in ptree array

I am using boost library to manipulate a JSON file and I would like to access to a specific index of an array in this JSON. 我正在使用Boost库来操作JSON文件,并且我想访问此JSON中数组的特定索引。

boost::property_tree::ptree& jsonfile;
const boost::property_tree::ptree& array =
  jsonfile.get_child("my_array");

What I would like to do is accessing to the value stored at index : 我想做的是访问存储在index处的值:

// This code does not compile
int value = array[index].get < int > ("property");

Just code it using the iterators: 只需使用迭代器对其进行编码:

template <typename T = std::string> 
T element_at(ptree const& pt, std::string name, size_t n) {
    return std::next(pt.get_child(name).find(""), n)->second.get_value<T>();
}

If you want to have the index checked for bounds: 如果要检查索引范围:

template <typename T = std::string> 
T element_at_checked(ptree const& pt, std::string name, size_t n) {
    auto r = pt.get_child(name).equal_range("");

    for (; r.first != r.second && n; --n) ++r.first;

    if (n || r.first==r.second)
        throw std::range_error("index out of bounds");

    return r.first->second.get_value<T>();
}

Demo 演示

Live On Coliru 生活在Coliru

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

using boost::property_tree::ptree;

template <typename T = std::string> 
T element_at(ptree const& pt, std::string name, size_t n) {
    return std::next(pt.get_child(name).find(""), n)->second.get_value<T>();
}

template <typename T = std::string> 
T element_at_checked(ptree const& pt, std::string name, size_t n) {
    auto r = pt.get_child(name).equal_range("");

    for (; r.first != r.second && n; --n) ++r.first;

    if (n || r.first==r.second)
        throw std::range_error("index out of bounds");

    return r.first->second.get_value<T>();
}

int main() {
    ptree pt;
    {
        std::istringstream iss("{\"a\":[1, 2, 3, 4, 5, 6]}");
        read_json(iss, pt);
    }

    write_json(std::cout, pt, false);

    // get the 4th element:
    std::cout << element_at_checked(pt, "a", 3) << "\n";

    // get it as int
    std::cout << element_at_checked<int>(pt, "a", 3) << "\n";

    // get non-existent array:
    try { std::cout << element_at_checked<int>(pt, "b", 0) << "\n"; } catch(std::exception const& e) { std::cout << e.what() << "\n"; }

    try { std::cout << element_at_checked<int>(pt, "a", 6) << "\n"; } catch(std::exception const& e) { std::cout << e.what() << "\n"; }
}

Prints 打印

{"a":["1","2","3","4","5","6"]}
4
4
No such node (b)
index out of bounds

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM