在Python 3中,Json转储字节失败

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编码?

Mic*_*nas 8

在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)