背景 :我正在编写一个应该管理我的音乐文件的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而失败?我还有许多其他对象,它们的键包含管道“ |” 和撇号“’” …目前,我没有其他人可以测试它,我是否应该发布数据库对象的腌制版本?
补充笔记
{rooney:js.db [‘songsbyid’] [rooney]} {“鲁尼|鲁尼的失落专辑|日落后的孩子|日落后的孩子.itunes.mp3”:{‘相册’:[u“鲁尼的失落专辑” ],“标题”:[u’日落之后的孩子们”],“艺术家”:[u’鲁尼”]}}
如果我通过重命名扩展名来排除这首歌,从而使脚本将其忽略,则另一首任意歌曲会导致相同的错误。我重命名并排除了这首新歌,然后碰到另一首新歌…我不知道有多少首。
我更改了程序以爬网包含原始问题歌曲的下一个最远子目录,然后json.dump在另一首完全不同的歌曲上引发TypeError …
因为它实际上不是字典;这是另一种 看起来 像字典的映射类型。使用type()来验证。传递它以dict()从中获得真实的字典。
type()
dict()