c++ - 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}]}"
解决方案
基本上,您的代码(您以模糊的方式显示)将字符串分配给 JSon 值对象,这就是为什么某些标志已被转义的原因。
问题是您不阅读文档。
请阅读JSON 快速查看注释部分如何解析输入:
解析
可以使用免费功能一步将 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;
}
推荐阅读
- ruby-on-rails - puma 支持哪些版本的 rails?
- automata - 构造有限状态机
- python - Python Pygame 和 Pymunk 游戏库 Non-colliding Shapes
- php - 使用composer安装PHP项目在Windows 10中显示错误
- javascript - 在 Angular 中订阅错误
- c++ - 已在 .obj 中定义,即使使用 #ifndef #define #endif
- android - 为 Android 构建 OpenBlas
- c - 为什么数组中的旧值仍然存在?
- javascript - 在具有多个句柄的 jquery ui 滑块上显示工具提示
- python - 在Python 3中确定数字是否为平方数的最快方法是什么