parser - python json text file



json.dump 던져 "TypeError:{...} JSON 직렬화 할 수 없습니다"겉보기 유효한 개체에? (2)

배경 : 저는 음악 파일을 관리해야하는 Python 프로그램을 작성하고 있습니다. 디렉토리를 크롤링하고 JSON으로 인코딩 된 파일 및 메타 데이터 (mutagen을 통해)를 간단한 "데이터베이스"로 파일에 저장합니다. 디렉토리를 잘 검색했지만 데이터베이스를 저장하거나 JSON으로 인코딩하면 "TypeError : {...}은 JSON을 직렬화 할 수 없습니다"(...는 일부 키와 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 아래의 결과 객체는 문제가 없으므로 문제가 데이터베이스의 크기와 어떤 관계가 있는지 궁금합니다.

    {루니 : 루니의 잃어버린 앨범 | 루니의 잃어버린 앨범 | 루이비통의 잃어버린 앨범 | ], '제목': [u'The Kids After Sunset], 'artist': [u'Rooney ']}}

  • 스크립트에서 무시하도록 확장명을 변경하여 노래를 제외하면 다른 임의의 노래에서 같은 오류가 발생합니다. 나는이 새로운 노래를 개명하고 제외 시켰고, 또 다른 새로운 노래를 만났다 ... 나는 얼마나 많은 존재가 있는지 모른다.

  • 나는 원래의 문제 노래가 포함 된 다음 가장 먼 하위 디렉토리를 크롤링하도록 프로그램을 변경했으며 json.dump는 완전히 다른 노래에서 TypeError를 발생시켰다.


Answer #1

그것은 실제로 사전이 아니기 때문에; 사전과 비슷한 또 다른 매핑 유형입니다. 확인하려면 type() 을 사용하십시오. dict() 에 전달하여 실제 사전을 가져옵니다.


Answer #2

사전에 데이터를 정규화하는 수업을 작성했습니다. 아래의 NormalizeData 클래스에있는 '요소'는 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()




typeerror