小编典典

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

json

背景
:我正在编写一个应该管理我的音乐文件的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 …


阅读 325

收藏
2020-07-27

共1个答案

小编典典

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

2020-07-27