正在解析来自 TCP 流的 JSON 数据

Parsing JSON data from TCP stream

我正在使用 nlohmann 的 json 库来解析来自 TCP 流的 json 数据。我不太确定如何处理来自本地套接字的部分 json 读取。假设在第一个 read() 中我得到:

{ 
    "MessageType": "CancelOrder",
    "Account":11111, 
    "CustomerNo":11111,
    "Side":"A",
    "DestinationMarket":"DUMB_MARKET",
    "Symbol":"DUMB_SYMBOL",
    "PositionEffect":"D",
    "Limi

在下面的套接字 read() 中,我得到:

    tPrice":0,
    "Quantity":1,
    "OrderType":"DUMB_TYPE",
    "StopPrice":0,
    "TimeInForce":"01.06.1999",
    "ExpireDate":0,
    "OrderID": "DUMB_ID",
    "IsStopOrder":"DUMB_STOP",
    "CorrelationId": 456
}

库无法解析部分读取,因为它们无效。图书馆是否提供解决方案?还是我应该自己实施解决方案?

这里的最佳做法应该是什么?

你在评论中得到了一些很好的答案。我要 assemble 一些并添加一个选项。

如果您可以控制通信的两端,那么有些人会认为您应该通过以下两种方式之一更改通信:

  • 先发送文字长度
  • 或者在套接字上使用更智能的消息传递系统

这些都可以为您解决问题。

我再提供两个可能的选择。

  • 发送“数据结束”指示符 -- 不会出现在 JSON 中的内容。例如,一个空字节。在 EOD 字符前换行。
  • 依次尝试解析数据,直到解析成功。

第二个有点丑。您将解析 { 并得到一个异常。然后你会为异常解析 {",一遍又一遍,直到你最终完成 JSON。我敢打赌它很慢,但它可能会起作用,而且它不依赖于以任何方式更改数据流。

就我个人而言,我会按顺序考虑:

  1. 使用正确的消息传递协议
  2. 使用数据结束指示符
  3. 发送长度
  4. 解析并捕获异常直到解析的技巧

我认为这些都可以。最后一个是唯一一个不会强制您更改数据流两端的。