2017-08-30 8 views
0

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"} 
このアプローチは、簡単に他のをサポートするように拡張することができ

タイプは、datetimeなどです。

str/int/float/...または関数の最後に他のシリアル化可能な型があることを確認してください。

@Tomalakが指摘したように、ASCIIエンコーディングの代わりにbase64エンコーディングを使用して、制御文字をサポートすることもできます。

+0

'obj.decode(" ASCII ")'は最適ではありません。バイトにはbase64を使用します。 – Tomalak

+0

@Tomalakは同意しましたが、OPの予想される結果とは一致しません。 –

+1

ええ、それはOPの予想される出力が間違っているからです。私はバイト文字列に制御文字が現れる可能性について考えなかったと思う。 :) '' signature ''が私がそれが意味すると思うことを意味するならば、base64の周りに道はありません。 – Tomalak

関連する問題