programing

json.dump가 "TypeError: {...}은(는) 유효한 개체에 대해 JSON을 직렬화할 수 없습니다"라고 던지는 경우

magicmemo 2023. 3. 22. 20:58
반응형

json.dump가 "TypeError: {...}은(는) 유효한 개체에 대해 JSON을 직렬화할 수 없습니다"라고 던지는 경우

배경:저는 음악 파일을 관리할 파이썬 프로그램을 쓰고 있습니다.디렉토리를 크롤하여 JSON으로 인코딩된 파일과 메타데이터(변환자를 통해)를 단순한 "데이터베이스"로 파일에 저장합니다.디렉토리 검색은 정상적으로 실행되지만 데이터베이스를 저장하려고 하거나 JSON으로 인코딩하려고 하면 "TypeError: {...} is not JSON serializable" (...는 dict의 키와 값입니다)라는 메시지가 나타납니다.

문제:프로그램은 다음과 같은 형식으로 큰 사전 개체를 작성합니다.

{
    "<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

(아이디 포맷이 좀 부피가 커서 해쉬가 될 수도 있는데...)

그래서 저는

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]} {"rooney|루니의 잃어버린 앨범|일몰 후의 아이들|The Kids After Sunset.itunes.mp3": {'앨범: [u'Rooney's Lost Album], [u'The Kids After Sunset], [u'Rooney]}}

  • 확장자 이름을 변경하여 노래를 제외하면 스크립트가 이를 무시하면 다른 임의 노래가 동일한 오류를 일으킵니다.이 신곡의 이름을 바꾸고 제외시켰는데, 또 다른 신곡으로 넘어갔는데...몇 개 있는지 모르겠어요.

  • 원래 문제 노래가 들어 있는 다음 가장 먼 서브디렉토리를 크롤링하도록 프로그램을 변경했는데, json.dump가 전혀 다른 노래에서 TypeError를 발생시켰습니다.

사전이 아니라 사전처럼 보이는 또 다른 매핑 유형이기 때문입니다.사용하다type()검증할 필요가 있습니다.을 달田에게 전하다dict()짜짜 、 할할할할할것 。

제 경우 Python dict의 부울값이 문제였습니다.JSON 부울 값은 소문자("True", "false")이지만 Python에서는 대문자("True", "False")로 표시됩니다.온라인에서는 이 솔루션을 찾을 수 없었지만 도움이 되었으면 합니다.

나는 사전에 있는 자료를 정규화하기 위해 수업을 썼다.아래 NormalizeData 클래스의 'element'는 dict 형식이어야 합니다.또한 __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()

언급URL : https://stackoverflow.com/questions/10872604/json-dump-throwing-typeerror-is-not-json-serializable-on-seemingly-vali

반응형