CPPRestSDK(casablanca)从传入的WebSocket消息中提取JSON(格式错误的令牌)

CPPRestSDK (casablanca) Extract JSON From Incoming WebSocket Messages (malformed token)

本文关键字:JSON 提取 格式 错误 令牌 WebSocket CPPRestSDK casablanca 消息      更新时间:2023-10-16

我正在连接一个WebSocket,该WebSocket总是用JSON进行回复。我看到websocket_incoming_message有一个extract_string方法,但在尝试了json:value的许多方法后,似乎只能通过逐个插入键值对来动态构建JSON数组。我是不是遗漏了什么,或者有没有办法将websocket_incoming_message的输出直接转换为json:value数组?

wsClient.set_message_handler([=](websocket_incoming_message msg)
{
// handle message from server...
printf("[WebSocket INBOUND]: %s", msg.extract_string().get().c_str());
printJSON(json::value::parse(conversions::to_string_t(msg.extract_string().get())));
});

printJSON运行在json::value中,并打印每个键值对。

RestAPI.exe中0x00007FF866923FB8处未处理的异常:Microsoft内存位置的C++异常:web::json::json_exception0x0000003E553FDDC0.发生

控制台输出:

[WebSocket INBOUND]:{"t":null,"s":null、"op":10、"d":{"heartbeat_interval":41250、"_trace":["gateway-prd-main-cr3x"]}}

尽管我们可以编译和运行应用程序,但我认为异常是由于传递了一个包含JSON表而不是单个元素的字符串造成的?这是否意味着我需要手动解析字符串并提取每个键值对,同时构建json数组?

必须有一种方法来做到这一点,这似乎是基本的必要功能。。

类似的未解决问题

如有任何帮助,我们将不胜感激!谢谢你抽出时间。

尝试捕获web::json::json_exception并打印消息,它可能会提示您出了什么问题

我得到了完整的解决方案。请尝试使用nuget的boost pacakges。文档将帮助您解析字符串中的json数据。我认为jsoncpp不是nuget中可用的更新包。所以请尝试nuget中提供的boost包。

MYJSON字符串

{"action":"refresh_dashboard","data":{"扩展名":["1012"],"名称":"Rahib Video"},{"user_id":"cc3f94ecc14ee9c55670dcde9adc1887","extensions":["1006"],"name":"Rounak S Kiran"},{"user_id":"6c29ebdb34e1761fdf9423c573087979","extensions":["1003"],"name":"Amar Nath"}":"2fc4142bdacf83c1957bda0ad9d50e3d","extensions":["1014"],"name":"Synway User1"},{"user_id":"74d5b5a9aca1faa4c2f217ce87b621d8","extensions":["1008"],"name":"Robin Raju"},{"user _id":"a7ad7e73bf93ea83c8efdc1723cba198","expansions":["1007"],"name":"Arshad Arif"}":"391391de005a8f5403c7b5591f462ea1","扩展名":["1013"],"名称":"Sangeeth J"},{"user_id":"3258f7ae4ae1db60435cbcf583f64a89","extensions":["1009"],"name":"Aby TL"},{"username":"90bc84e5e8a3427fe35e99bd4386de95","extension":["1010"],"name':"Prince T"},{"user_id":"b501ef5b270a196afc0eed557ca74237","extensions":"1005"],2af351e06deab2de92f5a633a44","扩展名":["1004"],"名称":"Ashok PA"}],"busy_users":[],"reg_users":[{"user_id":"901e6076ff351cfc2195fb86f8438a26","status":"registered"},{"user _id":"6c29ebdb34e1761fdf9423c573087979","status":"registrated"}],"contacts":"[{"owner_id":"901e6075ff351cfC2195fb86f4438a26","status":"ready"},"owner_id":"6c29ebDB34e1761FDf9423C573087977","state":"ready">

代码

client.receive().then([](websocket_incoming_message msg) {
std::cout << "receiving data from socket";
// msg.message_type();
return msg.extract_string();
//1..i have one string
//cout<<"n///////////test"<< msg.extract_string().get().c_str();
//  // 2.convert to json array
//json::value::parse(   ::to_string_t(msg.extract_string().get()))
//
}).then([](std::string body) {
//std::cout << "displaying the data";
std::cout << body << std::endl;

std::string ss = body;
ptree pt;
std::istringstream is(ss);
read_json(is, pt);
std::cout <<"n 1st"<< "action:     " << pt.get<std::string>("action") << "n";
std::cout <<"n 2nd"<< "data: " << pt.get<std::string>("data") << "n";
std::cout << "--------------------------------------------------------------";
for (auto& e : pt.get_child("users_list")) {
std::cout << "n" << "users list " << e.second.get<std::string>("user_id") << "n";

}
});

有用资源

  1. 使用Boost ptree 将JSON数组解析为std::string

  2. C++boost解析动态生成的json字符串(不是文件)