如何处理 TypeError:“bytes”类型的对象不可 JSON 序列化?

NKJ*_*NKJ 6 python base64 serialization json python-3.x

尝试将输出转换为 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)
Run Code Online (Sandbox Code Playgroud)

输出:

TypeError: Object of type 'bytes' is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

使用时:

print(json.dumps(dict(data)))
Run Code Online (Sandbox Code Playgroud)

它也显示相同的错误

Kum*_*nus 7

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

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

另外,您应该使用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))
Run Code Online (Sandbox Code Playgroud)


mar*_*eau 5

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

其次,正如错误消息所示,您无法序列化所需类型的bytes对象json.dumps()。要正确执行此操作,您需要使用某种编码将二进制数据解码为 Python 字符串。为了正确保存数据,您应该使用latin1编码,因为任意二进制字符串都是有效的latin1,它总是可以解码为 Unicode,然后再次编码回原始字符串(正如Sven 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))
Run Code Online (Sandbox Code Playgroud)


DYZ*_*DYZ 2

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

data['ProcessedImage'] = image.decode()
Run Code Online (Sandbox Code Playgroud)