【问题标题】:How to deal with TypeError: Object of type 'bytes' is not JSON serializable?如何处理 TypeError:'bytes' 类型的对象不是 JSON 可序列化的?
【发布时间】:2021-01-31 22:25:22
【问题描述】:

尝试将输出转换为 Json 格式,但出现错误。删除 json.dump 后,将数据转换为 base64 格式。但是当使用 json.dump 时会显示错误。

代码:

import json 
import base64

with open(r"C:/Users/Documents/pdf2txt/outputImage.jpg","rb") as img:
    image = base64.b64encode(img.read())
    data['ProcessedImage'] = image

print(json.dump(data)

输出:

TypeError: Object of type 'bytes' is not JSON serializable

使用时:

print(json.dumps(dict(data)))

它也显示相同的错误

【问题讨论】:

  • 确保发布导致上述行为的有效代码。显示的代码将无法解析/运行,至少有两个不同的原因。如果没有重现所描述问题的有效代码,一个有时正确的假设是实际有问题的代码和显示的代码不同。
  • 您遇到了同样的错误,因为它与您在 print 函数调用中使用的内容无关——它来自 image = base64.b64encode(img.read()) 行。

标签: python json python-3.x serialization base64


【解决方案1】:

你必须使用str.decode()方法。

您正在尝试将字节类型的对象序列化为 JSON 对象。 JSON schema 中没有这样的东西。所以你必须先将字节转换为字符串。

此外,您应该使用 json.dumps() 而不是 json.dump(),因为您不想写入文件。

在你的例子中:

import json 
import base64

with open(r"C:/Users/Documents/pdf2txt/outputImage.jpg", "rb") as img:
    image = base64.b64encode(img.read())
    data['ProcessedImage'] = image.decode() # not just image

print(json.dumps(data))

【讨论】:

    【解决方案2】:

    首先,我认为您应该使用json.dumps(),因为您使用不正确的参数调用json.dump(),并且它不会返回任何要打印的内容。

    其次,正如错误消息所示,您不能序列化 bytes 类型的对象,这正是 json.dumps() 所期望的。要正确执行此操作,您需要将二进制数据解码为带有某种编码的 Python 字符串。为了正确保存数据,您应该使用latin1 编码,因为任意二进制字符串有效的latin1 始终可以解码为Unicode,然后再次编码回原始字符串(如在this answerSven Marnach)。

    这是你的代码,展示了如何做到这一点(加上对其他不直接相关的问题的更正):

    import json
    import base64
    
    image_path = "C:/Users/Documents/pdf2txt/outputImage.jpg"
    data = {}
    
    with open(image_path, "rb") as img:
        image = base64.b64encode(img.read()).decode('latin1')
        data['ProcessedImage'] = image
    
    print(json.dumps(data))
    

    【讨论】:

    • 在获取 bs64 编码形式的打印输出时仍然遇到同样的问题,因为我是新手,你能告诉我如何获得真实的输出,以及如何解码 bs64 以获得真实的输出吗?数据 。提前致谢。
    • 不知道你在问什么。您可以撤消对值的解码并使用image.encode('latin1') 取回bytes
    【解决方案3】:

    image(或base64.b64encode 返回的任何东西)是二进制bytes 对象,而不是字符串。 JSON 无法处理二进制数据。如果要序列化图像数据,则必须对其进行解码:

    data['ProcessedImage'] = image.decode()
    

    【讨论】:

    • 如何从bs64编码值中获取真实数据,如何解码得到实际值。
    猜你喜欢
    • 1970-01-01
    • 2022-12-12
    • 2018-12-31
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2019-11-21
    • 2021-11-13
    相关资源
    最近更新 更多