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

drd*_*rez 45 python json typeerror

背景:我正在编写一个应该管理我的音乐文件的python程序.它抓取目录并将以JSON编码的文件及其元数据(通过mutagen)作为简单的"数据库"放入文件中.我有很好的目录搜索,但是当我尝试保存数据库或编码为JSON时,它会抛出"TypeError:{...}不是JSON可序列化的"(...是来自dict的一些键和值,更多关于以下内容)

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

{
    "<song id>":{
        "artist":"<song artist>",
        "album":"<song album>",
        "title":"<song title>"},
    ...
}
Run Code Online (Sandbox Code Playgroud)

每个歌曲文件都通过此格式编制索引.当我尝试将数据库转储到文件时,我得到了这个:

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
Run Code Online (Sandbox Code Playgroud)

随着特定歌曲条目的关键

Rooney|Rooney's Lost Album|The Kids After Sunset|The Kids After Sunset.itunes.mp3
Run Code Online (Sandbox Code Playgroud)

(id的格式有点笨重,我最终可能会散列......)

所以我试着

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

这样做很好

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

然后我尝试了这个:

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

哪个再次失败了类型错误.

为什么json.dump会失败该对象?我有很多其他对象,其中包含管道"|" 和撇号"'" ......此刻,我也没有办法对任何人来测试这一点,我应该张贴数据库对象的腌版本?

补充说明

  • 下面json.dumps得到的目标是好的,所以我想知道如果问题以任何方式对数据库的大小呢?

    {rooney:js.db ['songsbyid'] [鲁尼]} {"鲁尼|鲁尼的失落专辑|日落之后的孩子们|日落之后的孩子们".:''专辑':[u"鲁尼的失落专辑" ],'标题':[日落时的孩子们],'艺术家':[u'Rooney']}}

  • 如果我通过重命名扩展名来排除歌曲,以便脚本忽略它,则另一首任意歌曲会导致相同的错误.我重新命名并排除了这首新歌,并且遇到了另一首新歌......我不知道有多少歌.

  • 我改变了我的程序抓取包含原始问题的歌曲下一个最远的子目录,并提出传入json.dump在一个完全不同的歌曲类型错误...

Ign*_*ams 50

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

  • 我尝试在整个数据库对象的 json.dump 和“{rooney:js.db['songsbyid'][rooney]}”片段(第一个罪魁祸首歌曲条目)中的对象周围使用 dict() 和我仍然遇到类型错误...:/ (2认同)
  • 我发布这篇文章是为了其他谷歌用户的利益,他们在尝试这个建议时感到沮丧,感觉有点像帕特里克·斯塔与曼·雷交谈,当他们断言某件事确实是一个命令时。如果字典中的任何内容不可序列化,即使您在顶层序列化字典,您也会收到此类型错误。尝试 print(str(yourdict)) 并将其输出与错误输出进行比较以查看哪个对象。 (2认同)

Mat*_*ark 5

就我而言,我的 Python 字典中的布尔值是问题所在。JSON 布尔值是小写的(“true”、“false”),而在 Python 中它们是大写的(“True”、“False”)。无法在网上的任何地方找到此解决方案,但希望它有所帮助。