C++ 使用boost属性树读取int数组
我有一些JSON和一些整数数组变量,如下所示: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 =
{"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;
}