gpt4 book ai didi

python - 如何从 python 中的套接字读取 JSON? (JSON的增量解析)

转载 作者:太空狗 更新时间:2023-10-29 18:28:18 25 4
gpt4 key购买 nike

我打开了一个套接字,我想从中读取一些 json 数据。问题是标准库中的json模块只能解析字符串(load只读取整个文件并在里面调用loads)它甚至看起来模块内部的所有方式都取决于参数是字符串。

这是套接字的真正问题,因为您永远无法将其全部读取为字符串,并且在实际解析之前您不知道要读取多少字节。

所以我的问题是:是否有(简单而优雅的)解决方法?是否有另一个可以增量解析数据的json库?值得自己写吗?

编辑:它是 XBMC jsonrpc api。没有消息信封,我无法控制格式。每条消息可能位于一行或多行。我可以编写一些只需要某种形式的 getc 函数并使用 s.recv(1) 提供它的简单解析器,但这并不是一个非常 pythonic 的解决方案,我有点懒惰这样做:-)

最佳答案

编辑:鉴于您没有定义协议(protocol),这没有用,但在其他情况下可能有用。


假设它是一个流 (TCP) 套接字,您需要实现自己的消息框架机制(或使用现有的更高级别的协议(protocol))。一种直接的方法是将每条消息定义为一个 32 位整数长度字段,后跟那么多字节的数据。

Sender:取JSON包的长度,用struct模块打包成4个字节,发送到socket上,然后发送JSON包。

Receiver:从socket中反复读取,直到至少有4个字节的数据,使用struct.unpack解包长度。从套接字读取,直到您至少拥有那么多数据,这就是您的 JSON 数据包;剩下的就是下一条消息的长度。

如果在某些时候您想要通过同一个套接字发送包含 JSON 以外的内容的消息,您可能想要在长度和数据有效负载之间发送消息类型代码;恭喜,您又发明了一个协议(protocol)。

另一个稍微更标准的方法是 DJB 的 Netstrings协议(protocol);它与上面提出的系统非常相似,但使用文本编码长度而不是二进制;它直接受到框架的支持,例如 Twisted .

关于python - 如何从 python 中的套接字读取 JSON? (JSON的增量解析),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7337523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com