프로그래밍 언어/Python

클래스 JSON을 직렬화 가능하게 만드는 방법

Rateye 2021. 11. 5. 10:52
728x90
반응형
질문 : 클래스 JSON을 직렬화 가능하게 만드는 방법

파이썬 클래스를 직렬화하는 방법은 무엇입니까?

간단한 수업 :

class FileItem:
    def __init__(self, fname):
        self.fname = fname

다음과 같은 결과를 얻으려면 어떻게해야합니까?

>>> import json

>>> my_file = FileItem('/foo/bar')
>>> json.dumps(my_file)
TypeError: Object of type 'FileItem' is not JSON serializable

오류없이

답변

예상되는 출력에 대한 아이디어가 있습니까? 예를 들어, 그렇게할까요?

>>> f  = FileItem("/foo/bar")
>>> magic(f)
'{"fname": "/foo/bar"}'

json.dumps(f.__dict__) 호출 할 수 있습니다.

더 많은 사용자 정의 출력을 원하면 JSONEncoder 를 하위 클래스로 만들고 사용자 정의 직렬화를 구현해야합니다.

간단한 예는 아래를 참조하십시오.

>>> from json import JSONEncoder
>>> class MyEncoder(JSONEncoder):
        def default(self, o):
            return o.__dict__    

>>> MyEncoder().encode(f)
'{"fname": "/foo/bar"}'

그런 다음이 클래스를 cls json.dumps() 메서드에 전달합니다.

json.dumps(cls=MyEncoder)

디코딩도 원한다면 JSONDecoder 클래스에 object_hook 을 제공해야합니다. 예를 들면 :

>>> def from_json(json_object):
        if 'fname' in json_object:
            return FileItem(json_object['fname'])
>>> f = JSONDecoder(object_hook = from_json).decode('{"fname": "/foo/bar"}')
>>> f
<__main__.FileItem object at 0x9337fac>
>>>
출처 : https://stackoverflow.com/questions/3768895/how-to-make-a-class-json-serializable
728x90
반응형