如何从 Python 中的 websocket 消息增量解析 JSON?

Posted

技术标签:

【中文标题】如何从 Python 中的 websocket 消息增量解析 JSON?【英文标题】:How to incrementally parse JSON from a websocket message in Python? 【发布时间】:2016-01-03 04:32:14 【问题描述】:

我有 JSON 消息(JSON 哈希表)表示为通过 websocket 传入的字符串。从套接字读取的每个内容都可能返回一个不以消息边界结尾的字符串。在 Python 中解析 JSON 消息的最简单方法是什么?如何在不自己编写解析器(或大括号/括号匹配器)的情况下找到消息在字符串中终止的位置?

其他语言是否提供工具来简化此操作?

【问题讨论】:

您可以使用try .. except .. 解析合并的字符串,直到解析成功的 JSON 对象 请提供一些你想读的json格式。 【参考方案1】:

从套接字读取的每个内容都可能返回一个不以消息边界结尾的字符串。

这是不正确的 - Websockets 是一种面向消息的协议,与传统的面向流的 TCP 套接字协议相反,您需要担心和处理消息分块。

它建立在 TCP 之上,但是它会自动处理将各个片段拼接到 one complete message 中,然后再将其传递到应用层(您的代码)。

所以 websocket 像 UDP 一样面向消息,没有最大长度限制,但具有 TCP 的传递保证和拥塞控制。事实证明,TCP 的流导向并不是那么有用(想想有多少协议在 TCP 之上构建了某种“消息”概念)。事实上,SCTP (RFC 4960) 提供了许多与 TCP 顶部消息相同的好处,但删除了 TCP 部分以减少开销。不幸的是,SCTP 尚未得到广泛采用。

同样来自official RFC:

在 TCP 之上分层成帧机制,以返回构建 TCP 的 IP 数据包机制,但没有长度限制

【讨论】:

以上是关于如何从 Python 中的 websocket 消息增量解析 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

从 Python 中的 WebSocket 读取(来自 Javascript WebSocket 的数据)

当python中的连接失败时如何重新连接到websocket

如何修复 websocket-client Python 模块中的 CERTIFICATE_VERIFY_FAILED 错误?

如何使用 Python(带有 websockets 的服务器)和 JavaScript(客户端)接收 JSON 数据

如何从 websocket(客户端)打印流信息?

Python 中的 Google Cloud Speech-to-Text 使用 websocket 处理音频流