当前位置: 首页 > 面试题库 >

json.dump在看似有效的对象上抛出“ TypeError:{…}不可序列化”?

高正初
2023-03-14
问题内容

背景
:我正在编写一个应该管理我的音乐文件的python程序。它将爬网目录,并将文件和它们的元数据(通过mutagen)(通过mutagen)放入JSON中,作为简单的“数据库”。我的目录搜索很好,但是当我尝试保存数据库或将其编码为JSON时,它会引发“
TypeError:{…}不可序列化JSON”(…是字典中的一些键和值,更多有关以下内容)

问题 :程序按照以下格式构建大型词典对象:

{
    "<song id>":{
        "artist":"<song artist>",
        "album":"<song album>",
        "title":"<song title>"},
    ...
}

每个歌曲文件都通过这种格式编制索引。当我尝试将数据库转储到文件时,得到以下信息:

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    sit()
  File "D:\workbench\ideas\musicmanager\v0\spider.py", line 116, in sit
    json.dump(js.db,f,True)
  File "C:\Python27\lib\json\__init__.py", line 181, in dump
    for chunk in iterable:
  File "C:\Python27\lib\json\encoder.py", line 428, in _iterencode
    for chunk in _iterencode_dict(o, _current_indent_level):
  File "C:\Python27\lib\json\encoder.py", line 402, in _iterencode_dict
    for chunk in chunks:
  File "C:\Python27\lib\json\encoder.py", line 402, in _iterencode_dict
    for chunk in chunks:
  File "C:\Python27\lib\json\encoder.py", line 436, in _iterencode
    o = _default(o)
  File "C:\Python27\lib\json\encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: {'album': [u"Rooney's Lost Album"], 'title': [u'The Kids
After Sunset'], 'artist': [u'Rooney']} is not JSON serializable

该特定歌曲条目的键是

Rooney|Rooney's Lost Album|The Kids After Sunset|The Kids After Sunset.itunes.mp3

(id的格式有点笨重,我可能最终会对其进行哈希处理…)

所以我试图

json.dumps({'album': [u"Rooney's Lost Album"], 'title': [u'The Kids
After Sunset'], 'artist': [u'Rooney']})

效果很好,就像

json.dumps({"Rooney|Rooney's Lost Album|The Kids After Sunset|The Kids
After Sunset.itunes.mp3":""})

然后我尝试了这个:

rooney = "Rooney|Rooney's Lost Album|The Kids After Sunset|The Kids
    After Sunset.itunes.mp3"
json.dumps({rooney:js.db['songsbyid'][rooney]})

再次由于类型错误而失败。

为什么该对象因json.dump而失败?我还有许多其他对象,它们的键包含管道“ |” 和撇号“’”
…目前,我没有其他人可以测试它,我是否应该发布数据库对象的腌制版本?

补充笔记

  • json.dumps下面的结果对象很好,所以我想知道问题是否与数据库的大小有关?

{rooney:js.db [‘songsbyid’] [rooney]}
{“鲁尼|鲁尼的失落专辑|日落后的孩子|日落后的孩子.itunes.mp3”:{‘相册’:[u“鲁尼的失落专辑”
],“标题”:[u’日落之后的孩子们”],“艺术家”:[u’鲁尼”]}}

  • 如果我通过重命名扩展名来排除这首歌,从而使脚本将其忽略,则另一首任意歌曲会导致相同的错误。我重命名并排除了这首新歌,然后碰到另一首新歌…我不知道有多少首。

  • 我更改了程序以爬网包含原始问题歌曲的下一个最远子目录,然后json.dump在另一首完全不同的歌曲上引发TypeError …


问题答案:

因为它实际上不是字典;这是另一种 看起来 像字典的映射类型。使用type()来验证。传递它以dict()从中获得真实的字典。



 类似资料:
  • 背景:我正在编写一个python程序来管理我的音乐文件。它抓取目录并将文件及其元数据(通过诱变)以JSON编码,作为一个简单的“数据库”放入文件中。我可以很好地搜索目录,但当我尝试保存数据库或编码为JSON时,它会抛出“TypeError:{...}is not JSON序列化”(...是判决中的一些键和值,更多信息见下文) 问题:程序按照以下格式构建大型dictionary对象: 每个歌曲文件都

  • 我使用的是 DJango 1.8 和蟒蛇 3.4 当运行下面的视图时,Django抛出类型错误-对象不可JSON序列化 Views.py 我试图从mysql数据库中读取几行数据并显示在html文件中,当上面的视图运行时,我看到下面的错误信息 在HTML页面中,我有一个下拉列表。根据选择的选项,我的Ajax将返回从mysql表获取的记录。 Models.py GreenStats和YellowSta

  • 问题内容: 我使用Python Flask Restful API遇到问题,并且数据进入Elasticsearch,当我用Postman发布新数据时,问题是: TypeError:“ Response”类型的对象不可JSON序列化 你能帮助我吗? 模型: 视图: 错误: 编辑:我发现了问题。它在def post(self,people_id)方法中: 新队: 问题答案: 这可以简单地通过以下方式完

  • 问题内容: 我是Python的新手,并且正在学习教程。本教程中有一个示例: 现在,在教程中,。但就我而言,我得到以下错误: 问题答案: 好像你已经用指向类实例的相同名称遮盖了指向类的内置名称。这是一个例子: 我相信这是显而易见的。Python将对象名称(函数和类也是对象)存储在字典中(命名空间实现为字典),因此你可以在任何范围内重写几乎任何名称。它不会显示为某种错误。如你所知,Python强调“特

  • 问题内容: 我正在尝试使用flask在浏览器中显示已连接设备的列表。我在端口8000上启用了flask: 在server.py中: 在app.py中: 这是我的测试: 但我不断收到此错误: 在检查ttyUSB,…和其他设备是否存在时,我做错什么了吗? 问题答案: 问题在于您的端点正在返回列表。Flask只喜欢某些返回类型。可能最常见的两个是 一个对象 一个(与Python 2.x一起使用) 您还可

  • 我想确保我正确理解根据Java内存模型的‘有效不可变对象’行为。 假设我们有一个可变类,我们希望将它发布为一个有效不可变的类: 我们执行以下操作: 问题是:Java内存模型是否保证所有线程必须具有? 根据Java并发实践,这应该是正确的,但如果我错了,请纠正我。 3.5.3.安全发布习语 要安全地发布对象,必须同时使对对象的引用和对象的状态对其他线程可见。通过以下方法可以安全地发布正确构造的对象: