사용자 정의 인코더 없이 사용자 정의 개체 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!