2017-08-30 66 views
0

我想转换:字节转换的字典,以JSON

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

到JSON:

jsonified = json.dumps(response_data) 

,但它会导致错误消息:

TypeError: Object of type 'bytes' is not JSON serializable

是什么正确的转换方式?

预期结果

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

回答

5

你可以编写自己的编码器不能被序列化出的现成类型:

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"} 

这种方法可以很容易地扩展,以支持其他类型,如das日期时间。

只要确保在函数结尾处以str/int/float/...或任何其他可序列化类型结束。

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

+0

'obj.decode(“ASCII”)'不是最优的。使用base64作为字节。 – Tomalak

+0

@Tomalak表示同意,但这不符合OP的预期产出。 –

+1

是的,那是因为OP的预期输出是错误的。我敢打赌,他没有考虑字节序列中出现控制字符的可能性。 :)如果''signature''意思是我认为的意思,base64就没有办法。 – Tomalak