2017-08-30 87 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