>  기사  >  백엔드 개발  >  사용자 정의 인코더 없이 사용자 정의 개체 JSON을 직렬화하는 방법은 무엇입니까?

사용자 정의 인코더 없이 사용자 정의 개체 JSON을 직렬화하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 03:21:40226검색

How to Make Custom Objects JSON Serializable without Custom Encoders?

사용자 정의 인코더 없이 사용자 정의 개체 JSON 직렬화 가능

직렬화할 수 없는 개체의 사용자 정의 JSON 직렬화에는 일반적으로 json.JSONEncoder 확장 및 사용자 정의 추가가 포함됩니다. json.dumps()에 대한 인코더입니다. 그러나 기본 인코더를 사용하여 객체를 직렬화할 수 있으므로 간단한 사용자 정의 인코더가 필요하지 않습니다.

기본 인코더 몽키 패치

기본 인코더는 다음과 같을 수 있습니다. to_json()과 같은 객체의 특수 메서드를 확인하고 이를 직렬화에 사용하도록 수정(원숭이 패치)되었습니다. 이는 패키지 초기화 시 가져온 모듈에서 JSONEncoder.default()를 다시 정의하여 수행할 수 있습니다.

Pickle을 사용한 자동 직렬화

보다 포괄적인 솔루션에는 pickle 모듈을 사용하는 것이 포함됩니다. 표준 JSON 데이터 유형이 아닌 객체를 피클링합니다. 이 접근 방식을 사용하면 특별한 메서드 없이 사용자 정의 클래스 인스턴스를 포함한 대부분의 Python 객체를 자동으로 직렬화할 수 있습니다.

역직렬화

피클된 객체를 역직렬화하려면 사용자 정의 object_hook 함수는 json.loads()에 제공될 수 있습니다. 이 함수는 _python_object 키를 사용하여 객체를 피클 해제하여 원래 Python 상태로 복원합니다.

Python 3 이식성

Python 3에서 json.dumps()는 바이트 객체를 반환합니다. , 피클 직렬화를 위해 수정이 필요합니다. pickle.dumps() 결과는 latin1에서 디코딩된 다음 pickle.loads()를 사용하기 전에 다시 latin1로 인코딩될 수 있습니다.

make_json_serialized2라는 모듈을 고려하세요. 원숭이 패치 및 피클 기반 자동을 구현하는 직렬화:

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

def _default(self, obj):
    return {'_python_object': pickle.dumps(obj).decode('latin1')}

JSONEncoder.default = _default  # Replace the default method.</code>

이 모듈을 사용하려면 간단히 가져오면 직렬화가 자동으로 적용됩니다.

<code class="python">import make_json_serializable2

# Custom class 'Foo' is now implicitly JSON serializable
class Foo:
    def __init__(self, name):
        self.name = name

# Serialize and deserialize using the default JSON encoder
data = [Foo('Bar')]
json_string = json.dumps(data)
data2 = json.loads(json_string)
print(data2 == data)  # True</code>

이 접근 방식은 사용자 정의 개체 JSON을 만들기 위한 간단하고 일반화된 방법을 제공합니다. 수동 맞춤형 인코더 없이 직렬화 가능합니다.

위 내용은 사용자 정의 인코더 없이 사용자 정의 개체 JSON을 직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.