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

基于Boost库的C++11及更早版本JSON解析:提取media子字段

使用Boost库在C++11及更早版本解析JSON并存储键值对到二级动态数组

我们可以用Boost.PropertyTree组件实现需求——这是C++11及更早版本中处理JSON的主流Boost工具,虽对严格JSON支持有限,但足以应对普通键值对场景。

示例JSON

假设你的JSON文件(如media.json)内容如下:

{
  "media": {
    "Test1": "video.mp4",
    "Test2": "audio.mp3",
    "Test3": "image.png"
  }
}

实现步骤与代码

1. 依赖与编译

  • 确保已安装Boost库,编译时需链接boost_property_tree组件(例如GCC编译命令:g++ your_code.cpp -o output -lboost_property_tree)

2. 核心代码

以下代码兼容C11,同时标注了C03的兼容写法:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <vector>
#include <string>
#include <iostream>

int main() {
    // 存储键值对的二级动态数组,推荐用vector(自动管理内存)
    std::vector<std::vector<std::string>> key_value_store;

    try {
        boost::property_tree::ptree pt;
        // 读取并解析JSON文件
        boost::property_tree::read_json("media.json", pt);

        // 获取"media"节点,若不存在会抛出异常
        const boost::property_tree::ptree& media_node = pt.get_child("media");

        // 遍历media下的所有键值对
        for (const auto& entry : media_node) {
            const std::string& key = entry.first;
            // 读取对应的值(假设值都是字符串类型)
            const std::string& value = entry.second.get_value<std::string>();

            // C++11写法:直接用初始化列表
            key_value_store.push_back({key, value});

            // 如果是C++03,替换为下面两行:
            // std::vector<std::string> temp_pair;
            // temp_pair.push_back(key); temp_pair.push_back(value);
            // key_value_store.push_back(temp_pair);
        }

        // 打印验证结果
        for (const auto& pair : key_value_store) {
            std::cout << "键: " << pair[0] << ", 值: " << pair[1] << std::endl;
        }
    } catch (const boost::property_tree::json_parser_error& e) {
        std::cerr << "JSON解析错误: " << e.what() << std::endl;
        return 1;
    } catch (const boost::property_tree::ptree_bad_path& e) {
        std::cerr << "找不到media节点: " << e.what() << std::endl;
        return 1;
    } catch (const boost::property_tree::ptree_bad_data& e) {
        std::cerr << "值类型错误: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

3. 原生动态数组实现(可选)

如果必须使用原生二级动态数组(而非vector),需要手动管理内存,示例代码如下:

// 在try块中替换vector相关代码:
size_t item_count = 0;
// 先统计media下的元素数量
for (const auto& entry : media_node) {
    item_count++;
}

// 创建原生二级动态数组
std::string** dynamic_array = new std::string*[item_count];
size_t idx = 0;
for (const auto& entry : media_node) {
    dynamic_array[idx] = new std::string[2];
    dynamic_array[idx][0] = entry.first;
    dynamic_array[idx][1] = entry.second.get_value<std::string>();
    idx++;
}

// 使用数组(示例:打印)
for (size_t i = 0; i < item_count; i++) {
    std::cout << "键: " << dynamic_array[i][0] << ", 值: " << dynamic_array[i][1] << std::endl;
}

// 必须手动释放内存,避免泄漏
for (size_t i = 0; i < item_count; i++) {
    delete[] dynamic_array[i];
}
delete[] dynamic_array;

注意事项

  • Boost.PropertyTree不支持JSON的部分严格语法(比如数组的末尾逗号、字符串转义的某些细节),如果需要严格JSON解析,可考虑Boost.JSON,但Boost.JSON仅支持C++17及以后版本,不符合你的要求。
  • 若JSON中的值不是字符串类型,需根据实际类型调整get_value的模板参数(比如int、double)。

内容的提问来源于stack exchange,提问作者metcenger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:30:51