eat*_*hil 4 python json python-3.x python-3.5
我作为请求的一部分在post请求中发送二进制数据.我有一个字典,看起来像这样:
data = {"foo": "bar", "bar": b'foo'}
Run Code Online (Sandbox Code Playgroud)
当我尝试json.dumps这个字典时,我得到以下异常:
TypeError: b'foo' is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
这在Python 2.7中运行良好.我需要做什么才能对这些数据进行json编码?
在Python 3中,他们删除了byte支持json.(来源:https://bugs.python.org/issue10976).
可能的解决方法是:
import json
data = {"foo": "bar", "bar": b"foo"}
# decode the `byte` into a unicode `str`
data["bar"] = data["bar"].decode("utf8")
# `data` now contains
#
# {'bar': 'foo', 'foo': 'bar'}
#
# `json_encoded_data` contains
#
# '{"bar": "foo", "foo": "bar"}'
#
json_encoded_data = json.dumps(data)
# `json_decoded_data` contains
#
# {'bar': 'foo', 'foo': 'bar'}
#
json_decoded_data = json.loads(data)
# `data` now contains
#
# {'bar': b'foo', 'foo': 'bar'}
#
data["bar"] = data["bar"].encode("utf8")
Run Code Online (Sandbox Code Playgroud)
如果您没有使用约束json,您可以考虑使用bson(二进制JSON):
import bson
data = {"foo": "bar", "bar": b"foo"}
# `bson_encoded_data` contains
#
# b'\x1f\x00\x00\x00\x05bar\x00\x03\x00\x00\x00\x00foo\x02foo\x00\x04\x00\x00\x00bar\x00\x00'
#
bson_encoded_data = bson.BSON.encode(data)
# `bson_decoded_data` contains
#
# {'bar': b'foo', 'foo': 'bar'}
#
bson_decoded_data = bson.BSON.decode(data)
Run Code Online (Sandbox Code Playgroud)