首页 > 解决方案 > Boost::JSON,解析字符串

问题描述

所以这是我的 JSON:

string js = R"({"table":"orderBookL2_25","action":"insert","data":[{"symbol":"XBTUSD","id":8796514950,"side":"Buy","size":10000,"price":34850.5},{"symbol":"XBTUSD","id":8796515700,"side":"Buy","size":281,"price":34843}]})";

我想以某种方式将其转换为可以帮助我方便地访问值的对象。例如,类似的东西;

parsed_data["data"][0]["symbol"]

我曾尝试使用 JSON::Boost 但我不知道如何使用这个库进行解析。我试过这段代码:

json::value parsed_data{js}; cout << parsed_data.at(0);

但它的输出毫无价值:

"{\"table\":\"orderBookL2_25\",\"action\":\"insert\",\"data\":[{\"symbol\":\"XBTUSD\",\"id\":8796514950,\"side\":\"Buy\",\"size\":10000,\"price\":34850.5},{\"symbol\":\"XBTUSD\",\"id\":8796515700,\"side\":\"Buy\",\"size\":281,\"price\":34843}]}" 

标签: c++boostc++20

解决方案


基本上,您的代码(您以模糊的方式显示)将字符串分配给 JSon 值对象,这就是为什么某些标志已被转义的原因。

问题是您不阅读文档。

请阅读JSON 快速查看注释部分如何解析输入:

快速浏览 - 1.75.0

解析

可以使用免费功能一步将 JSON 解析到值容器中。在以下代码段中,解析错误由抛出的异常指示:

value jv = parse( "[1, 2, 3]" );

错误代码也是可能的:

error_code ec;
value jv = parse( R"( "Hello, world!" )", ec );

然后修复代码,例如:

#include <iostream>
#include <vector>
#define BOOST_JSON_STACK_BUFFER_SIZE 1024
#include <boost/json/src.hpp>
#include <boost/json.hpp>

using namespace boost::json;

int main()
{
    std::string js = R"({
    "table":"orderBookL2_25",
    "action":"insert",
    "data":[
        {
            "symbol":"XBTUSD",
            "id":8796514950,
            "side":"Buy",
            "size":10000,
            "price":34850.5
        },
        {
            "symbol":"XBTUSD",
            "id":8796515700,
            "side":"Buy",
            "size":281,
            "price":34843
        }
    ]
})";

    try {
        auto parsed_data = parse(js);
        std::cout << value_to<std::string>(parsed_data.at("data").at(0).at("symbol")) << '\n';
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }

    return 0;
}

现场演示


推荐阅读