用于通过 JSON 发送字节数据的 Python 2.x 和 3.x 兼容代码

Posted

技术标签:

【中文标题】用于通过 JSON 发送字节数据的 Python 2.x 和 3.x 兼容代码【英文标题】:Python 2.x and 3.x compatible code for sending byte data over JSON 【发布时间】:2013-10-25 18:33:32 【问题描述】:

我有一个 base-64 编码的字符串。

some_s = base64.encodestring(....)

在 Python 2.7 中,我可以将这样的字符串序列化为 JSON (json.dumps)。

在 Python 3.3 中,'some_s' 是一个字节字符串,需要先转换为 'str:

some_s2 = str(some_s2, encoding='ascii')

然后 some_s2 可以序列化为 JSON。

不幸的是,Python 2.7 不接受编码参数作为 str() 调用的一部分。

您将如何在此处编写同时运行 Python 2.7 和 Python 3.3 的转换代码?

【问题讨论】:

为什么有这么多反对票?这似乎是一个合理的问题。 【参考方案1】:

您可以检测您的值不是str 类型:

some_s = base64.encodestring(....)
if not isinstance(some_s, str):
    some_s = some_s.decode('ascii')

只有在 Python 3 中,some_s 的类型为 bytes。还要注意.decode() 方法,而不是str(some_s, encoding='ascii'),它可以在Python 2 和3 中工作。

【讨论】:

啊,是你。这就是你使用愚蠢的“匿名”名字所得到的,你从我这里得到建议。是的,在这种情况下,类型检测是您的最佳选择。

以上是关于用于通过 JSON 发送字节数据的 Python 2.x 和 3.x 兼容代码的主要内容,如果未能解决你的问题,请参考以下文章

Python OpenCV 图像到字节字符串以进行 json 传输

用于串行通信的 Python 字节数组

Python错误:打印(数据+“\ n”)类型错误:尝试通过网络套接字发送命令时无法将str连接到字节[重复]

Python struct作为网络数据包(未知字节序列)

使用 Python Twisted 和 Autobahn 从 Matlab 通过 WebSocket 发送 JSON 数据

Python - 没有空格的 json