使用Boost解析JSON数组时无法获取params.data.bids等值问题求助
Boost.Property_tree 解析JSON数组方案
Boost.Property_tree解析JSON数组时,会将数组内所有元素存储为对应节点的子节点,所有数组元素的键统一为空字符串,因此无法直接通过get方法按路径取值,需要先获取数组对应的ptree节点,再遍历子节点读取内容。
以下是适配你业务场景的完整实现代码:
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/json_parser.hpp> #include <iostream> #include <string> #include <sstream> int main() { // 此处替换为你实际的JSON输入流 std::stringstream ss(R"({"jsonrpc":"2.0","method":"subscription","params":{"channel":"book.BTC-PERPETUAL.raw","data":{"type":"change","timestamp":1635513739435,"prev_change_id":6807100702,"instrument_name":"BTC-PERPETUAL","change_id":6807100703,"bids":[["new",60772.0,50.0], "demo"],"asks":[]}}})"); boost::property_tree::ptree pt; boost::property_tree::read_json(ss, pt); // 原有可正常运行的字段读取代码 std::cout << "jsonrpc: " << pt.get<std::string>("jsonrpc") << std::endl; std::cout << "method: " << pt.get<std::string>("method") << std::endl; std::cout << "params.channel: " << pt.get<std::string>("params.channel") << std::endl; std::cout << "params.data.timestamp: " << pt.get<std::string>("params.data.timestamp") << std::endl; std::cout << "params.data.instrument_name: " << pt.get<std::string>("params.data.instrument_name") << std::endl; // 解析bids数组逻辑 boost::property_tree::ptree bids_node = pt.get_child("params.data.bids"); std::cout << "\nbids数组解析结果:" << std::endl; for (auto& item : bids_node) { // 数组元素的键固定为空字符串,item.second为元素对应的ptree节点 if (item.second.empty()) { // 普通类型元素直接取值 std::cout << "普通元素:" << item.second.get_value<std::string>() << std::endl; } else { // 嵌套数组需要二次遍历 std::cout << "嵌套数组元素:"; for (auto& nested_item : item.second) { // 数值类型可直接修改模板参数转换,比如get_value<double>() std::cout << nested_item.second.get_value<std::string>() << " "; } std::cout << std::endl; } } // 空数组解析逻辑示例(以asks为例) boost::property_tree::ptree asks_node = pt.get_child("params.data.asks"); if (asks_node.empty()) { std::cout << "\nasks数组为空" << std::endl; } return 0; }
注意事项
- 如果不确定数组路径是否存在,可以用
get_child_optional方法避免抛出异常,写法为auto opt_node = pt.get_child_optional("params.data.bids");,先判断返回值是否有效再操作 - Boost.Property_tree对JSON标准的支持有限,如果你有更复杂的JSON解析需求,可以使用Boost 1.75及以上版本自带的Boost.JSON库,兼容性和性能更优。
内容的提问来源于stack exchange,提问作者Fahad pro
相关产品推荐
相关产品推荐

