c++ - 用于 TCP 套接字的基于 C++ 流的 JSON 解析器
问题描述
我一直在寻找一种通过 tcp 套接字发送 JSON 并将其反序列化为对象的方法。我遇到的问题是,当我的消息太大时,TCP 会对其进行分块。通过这样做,我的客户只接收到 JSON 的一部分,解析器将该部分和以下内容作为格式错误的 JSON 发送。
我正在尝试寻找一种工具,它可以让我用我的 JSON 的部分视图来提供它。第一次,我的缓冲区只包含部分 JSON,我将它发送到解析器,它返回一些指示 JSON 未完成的内容。下一次,当我将新信息附加到缓冲区时,解析器从它所在的最后一个点继续并找到 JSON 消息的结尾(或者等待以防万一需要并且 JSON 进来两个以上的块)并返回包含该 JSON 内容信息的内容,并将其从缓冲区中删除,其中将附加来自流的下一个信息。
到目前为止,我发现了一些其他的想法,但对于其他语言(Java in this one: Is there a streaming API for JSON?)
解决方案
你有一些选择......一种是读取数据,直到出现一些特殊的字符序列(例如 https 使用\r\n\r\n
)。如果您使用 boost C++ 库,您可以查看boost::asio::async_read_until
或boost::asio::read_until
. 或者您可以实现您的读取例程,该例程以哨兵值停止。
第二种选择是有一个数据包的头文件......在标题中,您可以指定例如消息的长度。因此,您必须先阅读标题,然后再阅读整个正文。
推荐阅读
- c# - 我在下面的代码中收到 PXDefault 的发布错误
- reactjs - 撰写
我是怎么打字的? - c++ - 使用 wininet 上传文件到 FTP 服务器
- java - 编译程序时出现堆栈溢出错误
- php - 匹配最接近的数值 elasticsearchDSL(php)
- python - 使用 flask-Sqlalchemy 在来自不同数据库的两个表之间连接
- javascript - 有没有办法访问页面上几个相同组件的属性?
- javascript - 通过键检索 json 数据
- reactjs - React 类中的解构或变量声明
- spring-boot - 有没有办法在春季批处理中释放 @AfterChunks 中的 JVM 内存?