当前位置: 首页 > 知识库问答 >
问题:

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

林绪
2023-03-14

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

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

{
    "<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会导致该对象失败。倾倒我还有很多其他对象,其键包含管道“|”和撇号“'”。。。目前,我没有办法让其他人测试这个,我应该发布数据库对象的酸洗版本吗?

其他注释

>

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

    {鲁尼:js.db['songsbyid'][鲁尼]}{“鲁尼|鲁尼的迷失专辑|日落后的孩子们|日落后的孩子们。itunes.mp3”:{'Album':[u“鲁尼的迷失专辑”],'title':[u“日落后的孩子们],'artist':[u“鲁尼”}

    如果我通过重命名扩展名来排除歌曲,使脚本忽略它,则另一首任意歌曲会导致相同的错误。我重命名了

    我更改了程序以抓取包含原始问题歌曲的下一个最远子目录,json.dump在完全不同的歌曲上引发了TypeError...

  • 共有3个答案

    阎晋
    2023-03-14

    我写了一个类来规范化字典中的数据。下面的NormalizeData类中的“元素”需要是“字符”类型。您需要在__iterate()中替换为您的自定义类对象或您想要规范化的任何其他对象类型。

    class NormalizeData:
    
        def __init__(self, element):
            self.element = element
    
        def execute(self):
            if isinstance(self.element, dict):
                self.__iterate()
            else:
                return
    
        def __iterate(self):
            for key in self.element:
                if isinstance(self.element[key], <ClassName>):
                    self.element[key] = str(self.element[key])
    
                node = NormalizeData(self.element[key])
                node.execute()
    
    李俊雅
    2023-03-14

    在我的例子中,我的Python语句中的布尔值是问题所在。JSON布尔值是小写的(“true”、“false”),而在Python中它们是大写的(“True”、“False”)。在网上任何地方都找不到这个解决方案,但希望它能有所帮助。

    邴和雅
    2023-03-14

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

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

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

    • 我试图从python向json文件发送一个简单的字典,但我一直收到“TypeError:1425不是json可序列化的”消息。 如果我添加默认参数,那么它会写入,但整数值会作为字符串写入json文件,这是不可取的。

    • 问题内容: 当我尝试运行以下代码时: 我得到以下异常: 如何成功使用包含s的对象? 问题答案: 在序列化之前将集合变成列表,或使用自定义处理程序来这样做:

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

    • 我有以下用于序列化查询集的代码: 下面是我的 我需要将其序列化。但它说无法序列化