如何修复‘Object of type Tag is not JSON serializable’错误?
解决JSON序列化Tag类型对象的问题
你遇到的问题核心是urls、titles或views中包含了Tag类型的对象,JSON模块默认无法序列化自定义/第三方类实例。以下是具体的解决思路和方案:
1. 先明确Tag对象的本质
首先要确定你的Tag是什么类型:
- 如果是自定义的Tag类:直接提取它的核心属性,转成字典或基础类型。
- 如果是第三方库的Tag(比如BeautifulSoup的Tag实例):提取它的文本内容或HTML属性(比如
tag.text取文本、tag['href']取链接)。
2. 提前转换所有Tag对象到可序列化类型
在构建Video字典前,先把包含Tag的变量转成JSON支持的类型:
import json # 假设urls是含BeautifulSoup Tag的列表,提取链接属性 processed_urls = [tag['href'] for tag in urls] # 假设titles是含Tag的列表,提取文本内容 processed_titles = [tag.text.strip() for tag in titles] # 如果views是Tag对象,转成整数类型 processed_views = int(views.text.strip()) if isinstance(views, Tag) else views Video = { 'url': processed_urls, 'title': processed_titles, 'views': processed_views } with open("Video.json", "w") as write_file: json.dump(Video, write_file)
3. 用default参数处理全局序列化(适合零散的Tag对象)
如果Tag对象分散在多个结构中,可以写通用的序列化函数,传给json.dump的default参数:
import json def serialize_tag(obj): # 匹配自定义Tag类,返回其属性字典 if hasattr(obj, 'url') and hasattr(obj, 'title'): return {'url': obj.url, 'title': obj.title} # 匹配BeautifulSoup的Tag,返回文本 elif str(type(obj)).endswith('bs4.element.Tag'): return obj.text.strip() # 其他未知类型抛出原错误 raise TypeError(f"Object of type {type(obj).__name__} is not JSON serializable") Video = { 'url': urls, 'title': titles, 'views': views } with open("Video.json", "w") as write_file: json.dump(Video, write_file, default=serialize_tag)
你之前尝试default参数没解决,大概率是因为序列化函数没有正确匹配你的Tag类型,或者没有提取到正确的可序列化属性——要确保函数里的判断逻辑能准确识别你的Tag对象,并返回字符串、数字、列表、字典这类JSON支持的类型。
内容的提问来源于stack exchange,提问作者Abhay Lakra
相关产品推荐
相关产品推荐

