如何使用c++解析json中的嵌套数组
How to parse nested arrays inside json using C++
我知道如何在C++
中解析"正常"的JSON
数据。通常,我这样做,用boost::property_tree
和read_json
方法。它可能看起来像这样:
BOOST_FOREAH(ptree::value_type &v, pt.get_child("rows"){
vec.push_back(v.second.get<std::string>("key"));
}
和上面的代码对应这个JSON文件:
{
"rows":[{
"key":"1"
},{
"key":"2"
}]
}
然而,我得到的Neo4j
结果集看起来像:
{
"columns":{...},
"data":[[["object 1"]], [["object 2"]], [["object 3"]]]
}
我很感兴趣,想解析"data"
节点。我试着这样做:
BOOST_FOREAH(ptree::value_type &v, pt.get_child("data"){
vec.push_back(v.second.data());
}
,但这不起作用。我没有得到一个错误,但我的向量vec
仍然是空的,或者更准确地说,它填充了空值。所以,当我迭代这个vec
时,我看到了许多元素,但它们没有任何值。然而,我想有值"object 1"
, "object 2"
, "object 3"
。
解决方案如下:
using boost::property::ptree;
ptree pt;
//... populate ptree pt with data from some source
BOOST_FOREACH(ptree::value_type &v, pt.get_child('data')){
ptree subtree1 = v.second;
BOOST_FOREACH(ptree::value_type &vs, subtree1){
ptree subtree2 = vs.second;
BOOST_FOREACH(ptree::value_type &vs2, subtree2){
do_something(vs2.second.data());
}
}
}
下面的代码可以解析这样的JSON结构:
{
"data":[[["object 1"]], [["object 2"]], [["object 3"]]]
}
所以,与一些人所说的相反,实际上,没有必要使用其他第三方库。只要使用boost
,你就完成了。
这是我如何做的一个例子。您必须提前了解JSON结构。
#include <boost/lexical_cast.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
boost::property_tree::ptree pt, sub_pt;
std::string json_str, key, sub_key;
std::stringstream ss;
int value = 0, bus_num = 0;
json_str = "{"arduino_1": {"bus_1": 17425,"bus_2": 1025,"bus_3": 0,"bus_4": 0,"bus_5": 0,"bus_6": 0,"bus_7": 0,"bus_8": 0}}";
ss << json_str; // put string into stringstream
boost::property_tree::read_json(ss, pt); // put stringstream into property tree
for (boost::property_tree::ptree::iterator iter = pt.begin(); iter != pt.end(); iter++)
{
// get data
key = boost::lexical_cast <std::string>(iter->first.data());
sub_pt = iter->second;
// iterate over subtree
for (boost::property_tree::ptree::iterator sub_iter = sub_pt.begin(); sub_iter != sub_pt.end(); sub_iter++)
{
// get data
sub_key = boost::lexical_cast <std::string>(sub_iter->first.data());
value = boost::lexical_cast <int>(sub_iter->second.data());
}
}
相关文章:
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 在 glsl opengl 中将嵌套结构数组作为统一传递
- C++:带有 "auto" 的二维数组上的嵌套 For 循环
- 获取嵌套的 JSON 数组和矩阵C++
- 使用嵌套函数数组是个好主意吗?
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- 具有动态数组分配的OpenMP嵌套循环
- 比较嵌套 for 循环中的两个 wchar 数组?
- 如何从嵌套的 std::initializer_list 初始化 2D C 样式数组?
- 将嵌套的 std::arrays 视为具有链式 .data() 的单个平面数组
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 在 Qt 中解析嵌套的 JSON 时出现意外结果(数组不存在)
- 数组嵌套的代理
- C 无法使用嵌套环将数组的元素索引
- 嵌套在功能数组中的循环
- 嵌套调用中的数组运算符 (->) 重载
- C 从嵌套循环中的文件中读取,并将值分配给二维数组
- 如何初始化嵌套结构数组
- 如何使用嵌套的 if 语句检查字符数组
- 在与 OpenMP 并行的嵌套 for 循环中写入共享数组(通过指针)如何产生错误的结果