如何使用python将图片字节包含到JSON中?(编码问题)

如何使用python将图片字节包含到JSON中?(编码问题),python,json,image,encoding,byte,Python,Json,Image,Encoding,Byte,我希望将图片字节包含到JSON中,但我遇到了一个编码问题: import urllib import json data = urllib.urlopen('https://www.python.org/static/community_logos/python-logo-master-v3-TM-flattened.png').read() json.dumps({'picture' : data}) UnicodeDecodeError:“utf8”编解码器无法对位置0中的字节0x89进

我希望将图片字节包含到JSON中,但我遇到了一个编码问题:

import urllib
import json

data = urllib.urlopen('https://www.python.org/static/community_logos/python-logo-master-v3-TM-flattened.png').read()
json.dumps({'picture' : data})
UnicodeDecodeError:“utf8”编解码器无法对位置0中的字节0x89进行解码:起始字节无效


我不知道如何处理这个问题,因为我正在处理一个图像,所以我对这个编码问题有点困惑。我正在使用python 2.7。有人能帮我吗?:)

JSON数据需要处理Unicode文本。二进制图像数据不是文本,因此当
json.dumps()
函数尝试使用UTF-8(默认值)将bytestring解码为
unicode
时,解码失败

您必须首先用文本安全编码包装二进制数据,例如Base-64:

json.dumps({'picture' : data.encode('base64')})
当然,这就假定接收者希望您的数据被如此包装

如果您的API端点设计得非常糟糕,以至于希望图像字节作为文本传入,那么另一种方法是假装您的字节是真正的文本;如果您首先将其解码为Latin-1,则可以将这些字节直接映射到Unicode代码点:

json.dumps({'picture' : data.encode('latin-1')})

当数据已经是
unicode
对象时,
json
库将继续将其视为文本。这确实意味着它可以用转义码替换非ASCII码点。

我想到的这种情况的最佳解决方案是按空间排序的base85编码,它将四个字节表示为五个字符。您还可以将每个字节映射到U+0000-U+00FF格式的对应字符,然后将其转储到json中。
但是,这些方法可能会有点过头,而base64(易用性方面)将是赢家。

我希望它这么简单,但我正在处理一个需要字节的API:(@Thom:那么那个API设计得太糟糕了。@Thom:我给了你另一个选择,但要考虑到试图用一个设计得如此糟糕的API来实现这一点将是一败涂地,因为他们正在破坏JSON RFC。