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
'programing' 카테고리의 다른 글
Tymeleaf + CSS + Spring Boot (0) | 2023.03.22 |
---|---|
확장성과 테스트성을 고려하면서 도메인 엔티티를 DTO로 적절하게 변환하는 방법 (0) | 2023.03.22 |
워드프레스의 카테고리에 대한 RSS 피드 (0) | 2023.03.22 |
Angular에 정의된 메서드를 호출하는 방법JS 디렉티브? (0) | 2023.03.22 |
스프링 부트에서의 Dispatcher Servlet 및 web.xml (0) | 2023.03.22 |