【问题标题】:Decoding JSON that contains Base64解码包含 Base64 的 JSON
【发布时间】:2020-10-05 03:50:09
【问题描述】:

我正在向我的一个 API 发送一组图像的请求。 API 以 JSON 格式返回这些图像。此格式包含有关资源的数据以及表示 Base64 图像的单个属性。

返回的 JSON 示例。

{
    "id": 548613,
    "filename": "00548613.png",
    "pictureTaken": "2020-03-30T11:38:21.003",
    "isVisible": true,
    "lotcode": 23,
    "company": "05",
    "concern": "46",
    "base64": "..."
}

The correct content of the Base64
The incorrectly parsed Base64

这是通过 Python3 请求库完成的。当我收到来自 API 的成功响应时,我尝试使用以下方法将正文解码为 JSON:

url = self.__url__(f"/rest/all/V1/products/{sku}/images")
headers = self.__headers__()
r = requests.get(url=url, headers=headers)
if r.status_code == 200:
    return r.json()
elif r.status_code == 404:
    return None
else:
    raise IOError(
        f"Error retrieving product '{sku}', got {r.status_code}: '{r.text}'")

调用.json()会导致Base64内容乱七八糟,有些部分不存在,有些被其他字符替换。我尝试使用r.content.decode()utf-8ascii 选项手动解码内容,看看这是否是问题after seeing this post。可悲的是,这没有奏效。 我知道服务器的响应是正确的,它适用于 Postman,并且调用 print(r.content) 会生成一个包含有效 Base64 的 JSON 文档。

我将如何反序列化来自 API 的响应以获取有效的 Base64?

【问题讨论】:

  • @Trenton 我假设你的意思是 Base64,很遗憾我不能分享它,因为我没有序列化资源的所有权。
  • @Harjan 随机拍一张鸭子的照片。将其转换为 base64。将该base64放入您提供的请求中,看看是否出现问题。如果是,请发布该请求,以便我们尝试。
  • @Trenton 我添加了一些 Base64,正确解析后应该是 1024x1024 的粉红色和白色框的图片。

标签: python json python-requests base64


【解决方案1】:
import base64
import re
...
b64text = re.search(b"\"base64\": \"(?P<base>.*)\"", r.content, flags=re.MULTILINE).group("base")
decode = base64.b64decode(b64text).decode(utf-8)

既然您说“调用 print(r.content) 会产生有效的 Base64”,那么这只是对 base64 进行解码的问题。

【讨论】:

  • 好建议,我认为如果返回的只是 Base64,这可能会奏效。在我的内容上调用它会导致整个 JSON 响应从 Base64 解码。
  • @Harjan 那么这只是直接从文本中提取base64数据的问题,请参阅我的答案以获取示例实现。
  • 我尝试了您编辑的解决方案。但是调用 r.contentr.text 会导致同样损坏的 Base64。提取作品,但无法解析,因为它仍然包含非法字符。
  • @Harjan 检查您的内容类型和字符集,请求中的默认值是 text/html,您可以设置字符集 utf-8,这可能不是您的 API 使用的,使用设置适当的值r.encoding 并重试。您是否尝试过使用 urrlib 并重现此行为?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2019-04-03
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多