Boost beast 发送 json 字节数组到客户端抛出 websocket
Boost beast send json with byte array to client throw websocket
我有一个从字节数组转换为字符串的文件
processResultJson.append(reinterpret_cast<const char *const>(im->bits), sizeof(im->bits));
processResultJson.append(reinterpret_cast<const char *const>(im->bits), im_res->bmi->bmiHeader.biSizeImage);
docData.put("Image1", processResultJson);}
boost::property_tree::json_parser::write_json(m_stream, SRegulaDR::docData);
resultString = m_stream.str();
size_t n = net::buffer_copy(buffer_.prepare(resultString.size()), net::buffer(resultString)); buffer_.commit(n);
在这种情况下,我得到 error_code=2 - 文件结束
然后error_code=995I/O操作...
我如何发送 JSON 并将字节数组 转换为字符串
谢谢!!!
不要将 属性 Tree 当作 JSON 库来使用。它有众所周知的局限性:https://www.boost.org/doc/libs/1_75_0/doc/html/property_tree/parsers.html#property_tree.parsers.json_parser
请特别注意数组的限制。
接下来,您一开始并没有写数组,而是写了一个字符串。但由于它是二进制数据,它可能是一个有效的 JSON 字符串,这可能是错误的来源。
此外,您可能不需要再次复制整个 JSON 以将其放入缓冲区。相反,boost::asio::buffer(resultString)
会起作用(只要您确保 resultString
的生命周期足够,就像 buffer_
一样)。
稍微测试一下确实表明字符被 write_json
:
正确转义
#define BOOST_BIND_GLOBAL_PLACEHOLDERS
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
using namespace std::string_literals;
struct Im { std::array<std::uint64_t, 10> bits; };
int main()
{
auto im = std::make_unique<Im>(
Im { 0b0010'1100'1010'0010'0111'1100'0010 });
std::string_view bitmsg(
reinterpret_cast<char const*>(&im->bits),
sizeof(im->bits));
auto processResultJson = "some binary data: [=10=] \x10 \xef αβγδ\n"s;
processResultJson += bitmsg;
boost::property_tree::ptree docData;
docData.put("Image1", processResultJson);
std::ostringstream oss;
boost::property_tree::json_parser::write_json(oss, docData);
std::cout << oss.str();
}
版画
{ "Image1": "some binary data: \u0000 \u0010 αβγδ\nu0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" }
Json lint 将其报告为有效 JSON(对于它的价值)
但是,请考虑通过
进行双重确认
- 使用base64编码对二进制数据进行编码
- 使用 Boost JSON 或其他合适的 JSON 库
带有增强功能的演示 JSON
1.75.0 引入了一个合适的 JSON 库。让我们庆祝一下。
直接翻译就是:https://godbolt.org/z/es9jGc
json::object docData;
docData["Image1"] = processResultJson;
std::string resultString = json::serialize(docData);
但是,您现在可以轻松地使用强类型的适当数组:https://godbolt.org/z/K9c6bc
json::object docData;
docData["Image1"] = json::array(im->bits.begin(), im->bits.end());
打印
{"Image1":[46802882,0,0,0,0,0,0,0,0,0]}
或者,事实上,您可以使用 value_from
的默认转换::
#include <iostream>
#include <boost/json/src.hpp> // for header-only
namespace json = boost::json;
struct Im { std::array<std::uint64_t, 10> bits; };
int main()
{
auto im = std::make_unique<Im>(
Im { 0b0010'1100'1010'0010'0111'1100'0010, /*...*/ });
std::cout << json::object{ {"Image1", json::value_from(im->bits) } };
}
版画
{"Image1":[46802882,0,0,0,0,0,0,0,0,0]}
我有一个从字节数组转换为字符串的文件
processResultJson.append(reinterpret_cast<const char *const>(im->bits), sizeof(im->bits));
processResultJson.append(reinterpret_cast<const char *const>(im->bits), im_res->bmi->bmiHeader.biSizeImage);
docData.put("Image1", processResultJson);}
boost::property_tree::json_parser::write_json(m_stream, SRegulaDR::docData);
resultString = m_stream.str();
size_t n = net::buffer_copy(buffer_.prepare(resultString.size()), net::buffer(resultString)); buffer_.commit(n);
在这种情况下,我得到 error_code=2 - 文件结束 然后error_code=995I/O操作...
我如何发送 JSON 并将字节数组 转换为字符串 谢谢!!!
不要将 属性 Tree 当作 JSON 库来使用。它有众所周知的局限性:https://www.boost.org/doc/libs/1_75_0/doc/html/property_tree/parsers.html#property_tree.parsers.json_parser
请特别注意数组的限制。
接下来,您一开始并没有写数组,而是写了一个字符串。但由于它是二进制数据,它可能是一个有效的 JSON 字符串,这可能是错误的来源。
此外,您可能不需要再次复制整个 JSON 以将其放入缓冲区。相反,boost::asio::buffer(resultString)
会起作用(只要您确保 resultString
的生命周期足够,就像 buffer_
一样)。
稍微测试一下确实表明字符被 write_json
:
#define BOOST_BIND_GLOBAL_PLACEHOLDERS
#include <boost/property_tree/json_parser.hpp>
#include <iostream>
using namespace std::string_literals;
struct Im { std::array<std::uint64_t, 10> bits; };
int main()
{
auto im = std::make_unique<Im>(
Im { 0b0010'1100'1010'0010'0111'1100'0010 });
std::string_view bitmsg(
reinterpret_cast<char const*>(&im->bits),
sizeof(im->bits));
auto processResultJson = "some binary data: [=10=] \x10 \xef αβγδ\n"s;
processResultJson += bitmsg;
boost::property_tree::ptree docData;
docData.put("Image1", processResultJson);
std::ostringstream oss;
boost::property_tree::json_parser::write_json(oss, docData);
std::cout << oss.str();
}
版画
{ "Image1": "some binary data: \u0000 \u0010 αβγδ\nu0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" }
Json lint 将其报告为有效 JSON(对于它的价值)
但是,请考虑通过
进行双重确认- 使用base64编码对二进制数据进行编码
- 使用 Boost JSON 或其他合适的 JSON 库
带有增强功能的演示 JSON
1.75.0 引入了一个合适的 JSON 库。让我们庆祝一下。
直接翻译就是:https://godbolt.org/z/es9jGc
json::object docData;
docData["Image1"] = processResultJson;
std::string resultString = json::serialize(docData);
但是,您现在可以轻松地使用强类型的适当数组:https://godbolt.org/z/K9c6bc
json::object docData;
docData["Image1"] = json::array(im->bits.begin(), im->bits.end());
打印
{"Image1":[46802882,0,0,0,0,0,0,0,0,0]}
或者,事实上,您可以使用 value_from
的默认转换::
#include <iostream>
#include <boost/json/src.hpp> // for header-only
namespace json = boost::json;
struct Im { std::array<std::uint64_t, 10> bits; };
int main()
{
auto im = std::make_unique<Im>(
Im { 0b0010'1100'1010'0010'0111'1100'0010, /*...*/ });
std::cout << json::object{ {"Image1", json::value_from(im->bits) } };
}
版画
{"Image1":[46802882,0,0,0,0,0,0,0,0,0]}