Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义JSON编码器引发;对象不可序列化";错误_Python_Json_Python 3.x_Encoding - Fatal编程技术网

Python 自定义JSON编码器引发;对象不可序列化";错误

Python 自定义JSON编码器引发;对象不可序列化";错误,python,json,python-3.x,encoding,Python,Json,Python 3.x,Encoding,我正在尝试为我的一个类创建一个自定义JSON编码器。 我已经创建了一个尝试该方法的工具,它可以工作,但当我在项目中应用该方法时,它会不断抛出错误: json.dump(obj=self.tree, fp=f, cls=BookmarkEncoder, ensure_ascii=False) File "/usr/lib/python3.8/json/__init__.py", line 179, in dump for chunk in iterable:

我正在尝试为我的一个类创建一个自定义JSON编码器。 我已经创建了一个尝试该方法的工具,它可以工作,但当我在项目中应用该方法时,它会不断抛出错误:

    json.dump(obj=self.tree, fp=f, cls=BookmarkEncoder, ensure_ascii=False)
  File "/usr/lib/python3.8/json/__init__.py", line 179, in dump
    for chunk in iterable:
  File "/usr/lib/python3.8/json/encoder.py", line 438, in _iterencode
    o = _default(o)
  File "/usr/lib/python3.8/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type HTMLBookmark is not JSON serializable
我试图转换的对象是BeautifulSoup
标记
类的修改版本,该类的代码如下:

类HTMLBookmark(标记、节点):
“”“TreeBuilder类,用于向
BeautifulSoup标记类。添加了以下功能:
-将id添加到要导入的每个文件夹(“h3”)/url(“a”)
-将属性访问添加到标记类的属性
(添加日期、图标、图标uri、id、索引、标题、类型和url)
通常可以在“self.attrs”字典中找到。
-为(id、索引和标题)添加setter
-从迭代器iter重定向self.children(self.contents)
直接添加到列表(self.contents)“”
计数器=itertools.count(开始=2)
定义初始化(self,*args,**kwargs):
super()
如果self.name出现在(“a”、“h3”):
如果不是self.attrs.get(“id”):
self.attrs[“id”]=下一个(_类__.counter)
@财产
添加的def日期(自我):
添加日期=self.attrs.get(“添加日期”)
如果未添加日期_:
添加的日期=四舍五入(time.time()*1000)
返回整数(添加日期)
@财产
def图标(自我):
返回self.attrs.get(“图标”)
@财产
def图标_uri(自身):
返回self.attrs.get(“iconuri”)
@财产
def id(自身):
返回self.attrs.get(“id”)
@id设置器
def id(自身、新的_id):
self.attrs[“id”]=新的\u id
@财产
def索引(自):
返回self.attrs.get(“索引”)
@索引设置器
def索引(自索引、新索引):
self.attrs[“index”]=新索引
@财产
def标题(自我):
返回self.attrs.get(“标题”)
@头衔设定者
def标题(自我,新标题):
self.attrs[“title”]=新标题
@财产
def类型(自身):
如果self.name==“h3”:
返回“文件夹”
elif self.name==“a”:
返回“url”
@财产
def url(自我):
返回self.attrs.get(“href”)
@财产
def儿童(自我):
“”“以使儿童在不同领域的访问标准化
类别。”“”
返回自己的内容
HTMLBookmark类继承自节点:

类节点:
def创建文件夹作为json(自我):
文件夹={
“类型”:自我类型,
“id”:self.id,
“索引”:自索引,
“家长id”:self.parent\u id,
“头衔”:自我头衔,
“添加日期”:self.date\u添加,
“儿童”:[…],
}
返回文件夹
def创建url作为json(自我):
url={
“类型”:自我类型,
“id”:self.id,
“索引”:自索引,
“家长id”:self.parent\u id,
“头衔”:自我头衔,
“添加日期”:self.date\u添加,
“url”:self.url,
“图标”:self.icon,
“iconuri”:self.icon_uri,
“标签”:self.tags,
}
返回url
定义报告(自我):
返回f“{self.title}-{self.type}-id:{self.id}”
这是我的自定义编码器

类书签编码器(json.JSONEncoder):
def defaut(自身,o):
如果isinstance(o,HTMLBookmark):
如果o.type==“文件夹”:
返回o.创建文件夹作为json()
elif o.type==“url”:
返回o.创建_url_作为_json()
返回json.JSONEncoder.default(self,o)
最后,这是触发错误的代码:

    json.dump(obj=self.tree, fp=f, cls=BookmarkEncoder, ensure_ascii=False)
  File "/usr/lib/python3.8/json/__init__.py", line 179, in dump
    for chunk in iterable:
  File "/usr/lib/python3.8/json/encoder.py", line 438, in _iterencode
    o = _default(o)
  File "/usr/lib/python3.8/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type HTMLBookmark is not JSON serializable
打开(输出文件“w”,编码=“Utf-8”)为f:
dump(obj=self.tree,fp=f,cls=BookmarkEncoder,确保ascii=False)
其中,
self.tree
是一个
HTMLBookmark
对象,通过使用BeautifulSoup导入HTML文件创建

如果需要更多信息,请务必告诉我,谢谢:)

编辑:


这里是一个链接,指向@Ulrich Eckhardt在评论中建议的工作。

看起来您有一个打字错误:
def defaut(self,o):
应该是
def default(self,o):

这不需要更多信息,但需要更精确的信息:提取a并作为您问题的一部分提供。这意味着我将代码放入一个文件中,运行它并查看您的错误,而不是我这边的任何猜测或解释。@UlrichEckhardt,我已按照您的建议将它们添加到帖子中,谢谢:)!不,对不起。我很高兴你有你的答案,但链接到不稳定的外部网站与代码不算,正是因为他们可以随时改变。把它放在内联,确保它是最小的。也不要添加“编辑”部分,让你的问题看起来像一个演员。那么我该怎么办?如果你查看链接,你会发现拥有一个功能片段所需的代码量是很多的,我认为将所有内容都放在文章中并不实用/可读。如果需要,你应该获取代码并检查每一行。特别是,错误后从未执行的行可以直接抛出。站点规则要求您这样做,因为在许多情况下,减少的问题范围会使解决方案变得明显,从而消除了一些琐碎的问题。