【发布时间】:2021-07-07 10:28:18
【问题描述】:
我正在使用 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
}
库无法解析部分读取,因为它们无效。图书馆是否提供解决方案?还是我应该自己实施解决方案?
这里的最佳做法应该是什么?
【问题讨论】:
-
一个可行的解决方案是在单独从套接字读取之后合并所有字符串,直到在字符串末尾找到尾随
}。然后,您可以继续处理 JSON。 -
低延迟的应用不要使用JSON相关的RPC(其实也没有好的工业级技术方案),建议试试grpc或者fbthrift。
-
在
content之前发送length,例如HTTP标头。 -
一个潜在的解决方案是在每次读取时获取尽可能多的有效键,并在它们之后插入
},解析它们,然后当更多键出现时重复并合并对象一起。我不确定这会是什么性能,但我怀疑没有比按照@Ruks 建议的那样连接所有数据好多少。 -
我参与了一个使用 JSON over IPC 的项目。如果您确实无法使用这种数据格式,我有几个建议 - 1. 使用面向消息的 IPC 库而不是原始 TCP。我们使用 ZeroMQ,保证我们不会收到这样的部分消息。 2. 如果可能,不要将数据发送为字符串化的 JSON。由于频繁的字符串双转换,我们遇到了数值数据的主要性能问题。如上所述,JSON 以外的其他东西可能更好。但有时你必须做你必须做的。
标签: c++ json stream nlohmann-json