python-3.x 如何在JSON中编码字节?json.dumps()抛出TypeError

iqjalb3h  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(227)

我试图用json编码一个包含字节串的字典,得到一个is not JSON serializable error

import base64
import json

data = {}
encoded = base64.b64encode(b'data to be encoded')
data['bytes'] = encoded

print(json.dumps(data))

我得到的错误:

TypeError: b'ZGF0YSB0byBiZSBlbmNvZGVk\n' is not JSON serializable

如何正确地用JSON对包含字节的字典进行编码?

zzlelutf

zzlelutf1#

JSON format只支持 *unicode字符串 *。由于base64.b64encode将字节编码为仅ASCII字节,因此您可以使用该编解码器来解码数据:

import base64

encoded = base64.b64encode(b'data to be encoded')  # b'ZGF0YSB0byBiZSBlbmNvZGVk' (notice the "b")
data['bytes'] = encoded.decode('ascii')            # 'ZGF0YSB0byBiZSBlbmNvZGVk'

请注意,要获取原始数据,您不需要将其重新编码为字节,因为b64decode处理仅ASCII字符串以及字节:

decoded = base64.b64decode(data['bytes'])  # b'data to be encoded'
kkih6yb8

kkih6yb82#

正如@Martijn提到的,只有字符串是json可序列化的(使用json)。通过指定编码,可以使用str()调用将bytes对象转换为字符串。

data = {}
encoded = base64.b64encode(b'data to be encoded')
data['bytes'] = str(encoded, encoding='ascii')
#               ^^^          ^^^^^^^^^^^^^^^^
json.dumps(data)   # '{"bytes": "ZGF0YSB0byBiZSBlbmNvZGVk"}'

相关问题