根据Consumer Surveys文档,questions[].images[].data
字段采用字节数据类型。
我使用Python 3实现,但API给出错误,如Invalid ByteString
或字节类型is not JSON serializable.
我使用下面的代码:
import base64
import urllib
url = 'http://example.com/image.png'
raw_img = urllib.request.urlopen(url).read()
# is not JSON serializable due to json serializer not being able to serialize raw bytes
img_data = raw_img
# next errors: Invalid ByteString, when tried with base64 encoding as followings:
img_data = base64.b64encode(raw_img)
# Also tried decoding it to UTF.8 `.decode('utf-8')`
img_data
是被发送到API的JSON有效负载的一部分。
我错过了什么吗?什么是正确的方式来处理图像数据上传的问题?我查了https://github.com/google/consumer-surveys/tree/master/python/src
,但是没有这个部分的例子。
谢谢
您需要使用web-safe/URL-safe编码。这里有一些关于在Python中执行此操作的文档:https://pymotw.com/2/base64/#url-safe-variations
在您的例子中,它看起来像
img_data = base64.urlsafe_b64encode(raw_img)
ETA:在Python 3中,API期望图像数据为str
类型,因此可以进行JSON序列化,但base64.urlsafe_b64encode
方法以UTF-8 bytes
的形式返回数据。您可以通过将字节转换为Unicode来修复此问题:
img_data = base64.urlsafe_b64encode(raw_img)
img_data = img_data.decode('utf-8')