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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:45:09