You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 21:36:00