사용자 정의 인코더를 구현하지 않고 Python에서 사용자 정의 개체 JSON을 직렬화하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-10-31 10:19:02
원래의
347명이 탐색했습니다.

How can I make custom objects JSON serializable in Python without implementing custom encoders?

사용자 정의 인코더를 구현하지 않고 사용자 정의 개체 JSON 직렬화 가능

Python의 기본 JSON 직렬화 메커니즘에는 json.JSONEncoder의 사용자 정의 하위 클래스를 생성하는 작업이 포함됩니다. 직렬화할 수 없는 객체를 처리합니다. 이 접근 방식은 널리 사용되지만 호출자의 코드를 수정하지 않고 JSON 클래스를 직렬화하려는 사용자에게는 번거로울 수 있습니다.

이 문제를 해결하기 위한 한 가지 잠재적인 해결책은 Python의 원숭이 패치 기술을 활용하는 것입니다. 여기에는 런타임 시 소스 코드를 변경하여 기존 모듈의 동작을 수정하는 작업이 포함됩니다. 이 경우 json 모듈의 JSONEncoder.default() 메서드를 수정하여 직렬화되는 개체에 특수 "to_json" 메서드가 있는지 확인할 수 있습니다. 이러한 메소드가 존재하는 경우 객체의 JSON 표현을 생성하는 데 사용할 수 있습니다.

이 접근 방식을 구현하려면 다음 코드를 사용하여 모듈(예: make_json_serialized.py)을 생성하세요.

<code class="python">from json import JSONEncoder

def _default(self, obj):
    return getattr(obj.__class__, "to_json", _default.default)(obj)

_default.default = JSONEncoder.default  # Save unmodified default.
JSONEncoder.default = _default # Replace it.</code>
로그인 후 복사

이 코드는 직렬화되는 개체에서 "to_json" 메서드를 확인하기 위해 JSONEncoder.default() 메서드를 수정합니다. 발견되면 해당 메소드를 사용하여 JSON 표현을 생성합니다. 그렇지 않으면 기본 동작이 사용됩니다.

이 모듈을 사용하려면 JSON 직렬화 작업 전에 모듈을 가져와서 원숭이 패치를 적용하세요.

<code class="python">import make_json_serializable</code>
로그인 후 복사

이제 "to_json" 메서드는 사용자 정의 인코더 없이 해당 메서드를 사용하여 직렬화됩니다.

그러나 이 접근 방식을 사용하려면 여전히 JSON을 직렬화하려는 각 클래스에 대해 사용자 정의 "to_json" 메서드를 구현해야 합니다. 더 많은 유연성을 제공하는 대체 솔루션은 피클 모듈을 사용하여 객체를 자동으로 직렬화 및 역직렬화하는 것입니다.

JSONEncoder.default() 메서드를 원숭이 패치하여 비표준 JSON 데이터 유형을 피클함으로써 다음과 같은 문제를 제거할 수 있습니다. 사용자 정의 직렬화 방법이 필요합니다. 그러나 역직렬화 프로세스에는 피클된 객체를 처리하기 위한 사용자 정의 object_hook 함수가 필요합니다.

이 접근 방식은 호출자의 코드 수정 없이 사용자 정의 객체 JSON을 직렬화할 수 있도록 하는 더 명확하고 일반적인 방법을 제공합니다.

위 내용은 사용자 정의 인코더를 구현하지 않고 Python에서 사용자 정의 개체 JSON을 직렬화하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿