正在解析来自 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。我敢打赌它很慢,但它可能会起作用,而且它不依赖于以任何方式更改数据流。
就我个人而言,我会按顺序考虑:
- 使用正确的消息传递协议
- 使用数据结束指示符
- 发送长度
- 解析并捕获异常直到解析的技巧
我认为这些都可以。最后一个是唯一一个不会强制您更改数据流两端的。
我正在使用 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。我敢打赌它很慢,但它可能会起作用,而且它不依赖于以任何方式更改数据流。
就我个人而言,我会按顺序考虑:
- 使用正确的消息传递协议
- 使用数据结束指示符
- 发送长度
- 解析并捕获异常直到解析的技巧
我认为这些都可以。最后一个是唯一一个不会强制您更改数据流两端的。