如何使用Boost.PropertyTree解析JSON节点并转换为std::map<int, json_data>
实现方案
按照固定顺序提取每个嵌套数组的元素值,逐条目填充到目标map容器中,完整实现逻辑如下:
前置校验
在取值前先对获取到的JSON节点做类型校验,避免因JSON结构不匹配引发内存访问错误。
完整实现代码
// 调用提供的接口拿到目标层级的JSON节点 auto& level1_1_node = get_child("level_1.level_1_1"); // 校验节点是否为数组结构 if (!level1_1_node.is_array()) { throw std::logic_error("目标节点不是合法数组结构"); } std::map<int, json_data> parsed_result; // 遍历数组中的每一个子项 for (const auto& row_item : level1_1_node) { // 校验子项结构:必须是长度至少为5的数组,和定义的json字段一一对应 if (!row_item.is_array() || row_item.size() < 5) { continue; } // 按JSON数组的位置顺序提取值 int map_key = row_item[0].get<int>(); // 数组第一个元素作为map的key json_data data; data.str = row_item[1].get<std::string>(); // 第二个元素对应结构体的str字段 data.num1 = row_item[2].get<int>(); // 第三个元素对应num1 data.num2 = row_item[3].get<int>(); // 第四个元素对应num2 data.num3 = row_item[4].get<int>(); // 第五个元素对应num3 parsed_result.emplace(map_key, std::move(data)); }
注意事项
- 取值顺序必须和JSON里嵌套数组的元素顺序完全对齐,一旦索引错位会导致字段赋值错误
- JSON字符串字段的转义处理由底层JSON库自动完成,不需要手动做反转义操作
std::map默认会对重复的key做覆盖处理,如果需要保留所有同key的条目,可将容器替换为std::multimap- 不要省略结构校验步骤,遇到生产环境的异常JSON数据时,未校验的直接取值很容易触发程序崩溃
- 如果项目中JSON库的节点取值接口不是
.get<T>(),只需要替换对应取值方法即可,整体遍历逻辑完全不变
内容的提问来源于stack exchange,提问作者ivanovIAVDD
相关产品推荐
相关产品推荐

