基于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
相关产品推荐
相关产品推荐

