【问题标题】:C++ streaming based JSON parser for TCP sockets [closed]用于 TCP 套接字的基于 C++ 流的 JSON 解析器 [关闭]
【发布时间】:2018-05-23 10:23:31
【问题描述】:

我一直在寻找一种通过 tcp 套接字发送 JSON 并将其反序列化为对象的方法。我遇到的问题是,当我的消息太大时,TCP 会对其进行分块。通过这样做,我的客户只接收 JSON 的一部分,解析器将该部分和以下内容作为格式错误的 JSON 发送。

我正在尝试寻找一种工具,让我可以使用我的 JSON 的部分视图来提供它。第一次,我的缓冲区只包含部分 JSON,我将它发送到解析器,它返回一些指示 JSON 未完成的内容。下一次,当我将新信息附加到缓冲区时,解析器从它所在的最后一个点继续并找到 JSON 消息的结尾(或者等待以防万一需要并且 JSON 进来两个以上的块)并返回包含该 JSON 内容信息的内容,并将其从缓冲区中删除,其中将附加来自流的下一个信息。

到目前为止,我发现了一些其他的想法,但对于其他语言(Java 在这个:Is there a streaming API for JSON?

【问题讨论】:

  • 一个简单的方法是有一个整个数据包大小的标题...首先读取标题,然后读取正文...
  • 这会打破发送普通 JSON 的想法,然后就不再值得使用 JSON。我将在 TCP 之上构建一个协议
  • 工具建议偏离主题,抱歉。但是您走在正确的道路上;流式 JSON 解析器比手动破解更受欢迎。也就是说,你考虑过 HTTP 吗?仍然是 TCP 之上的协议,但没有手动处理。
  • 感谢您告诉我。我不知道这会是一个离题的案例。下次我会记住的。我们可以关闭它,因为我已经有了一个“手工制作”的解决方案。

标签: c++ json parsing tcp


【解决方案1】:

我曾经遇到过类似的问题。

为了解决这个问题,我确定了一个块的最大大小,并在发送之前将我的消息手动拆分为较小的大小。还将索引和最大索引附加到“手动块”以在接收端进行组装。

不确定这是否是最好的方法,但确实有效

【讨论】:

  • 为了能够手动解析合并所有块并最终解析它,我必须多次检查 JSON 文件。此外,在将它们合并后,我将不得不再次通过 JSON 来实际解析它
【解决方案2】:

您有一些选择...一种是读取数据直到出现一些特殊的字符序列(例如 https 使用\r\n\r\n)。如果您使用 boost C++ 库,您可以查看boost::asio::async_read_untilboost::asio::read_until。或者您可以实现您的读取例程,该例程以一个标记值停止。

第二种选择是有一个数据包的头文件...在头文件中,您可以指定例如消息的长度。所以你必须先阅读标题,然后阅读全文。

【讨论】:

  • 我也想过这个,强制所有的 JSON 为一行,并用换行符分隔。但是,它不是最优的,因为为了做到这一点,我必须多次检查 JSON 文件才能提取它并将其发送到解析器
猜你喜欢
  • 2015-10-16
  • 2012-03-26
  • 1970-01-01
  • 2011-01-07
  • 2016-12-31
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
  • 2014-08-28
相关资源
最近更新 更多