Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字节的dict转换为json_Python_Json_Python 3.x - Fatal编程技术网

Python 将字节的dict转换为json

Python 将字节的dict转换为json,python,json,python-3.x,Python,Json,Python 3.x,我正在尝试转换: response data = {'policy': b'eyJleHBpcmF0a', 'signature': b'TdXjfAp'} 到json: jsonified = json.dumps( response_data ) 但它会导致错误消息: TypeError:类型为“bytes”的对象不可JSON序列化 进行正确转换的正确方法是什么 预期结果 jsonified = {"policy": "eyJleHBpcmF0a", "signature": "TdXj

我正在尝试转换:

response data = {'policy': b'eyJleHBpcmF0a', 'signature': b'TdXjfAp'}
到json:

jsonified = json.dumps( response_data )
但它会导致错误消息:

TypeError:类型为“bytes”的对象不可JSON序列化

进行正确转换的正确方法是什么

预期结果

jsonified = {"policy": "eyJleHBpcmF0a", "signature": "TdXjfAp"}

您可以为无法即时序列化的类型编写自己的编码器:

import json

class MyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, (bytes, bytearray)):
            return obj.decode("ASCII") # <- or any other encoding of your choice
        # Let the base class default method raise the TypeError
        return json.JSONEncoder.default(self, obj)

data = {'policy': b'eyJleHBpcmF0a', 'signature': b'TdXjfAp'}
jsonified = json.dumps( data, cls=MyEncoder )
print(jsonified)
# {"policy": "eyJleHBpcmF0a", "signature": "TdXjfAp"}
这种方法可以很容易地扩展到支持其他类型,例如DasDateTime

只需确保最终得到str/int/float/。。。或函数末尾的任何其他可序列化类型


正如@Tomalak所指出的,您也可以使用base64编码而不是ASCII编码来确保您支持控制字符。

obj.decodescii不是最优的。使用base64表示字节。@Tomalak同意,但它与OP的预期输出不匹配。是的,这是因为OP的预期输出是错误的。我打赌他没有考虑控制字符在字节序列中出现的可能性如果“签名”的意思和我想的一样,那么base64就没有办法了。