Menjadikan Objek Tersuai JSON Boleh Diseri tanpa Pengekod Tersuai
Siri JSON Tersuai bagi objek yang tidak boleh disiri lazimnya melibatkan pelanjutan json.JSONEncoder dan penambahan tersuai pengekod ke json.dumps(). Walau bagaimanapun, adalah mungkin untuk menjadikan objek boleh bersiri menggunakan pengekod lalai, menghapuskan keperluan untuk pengekod tersuai yang remeh.
Monyet-Menampal Pengekod Lalai
Pengekod lalai boleh diubah suai (tampalan monyet) untuk menyemak kaedah khas dalam objek, seperti to_json(), dan menggunakannya untuk bersiri. Ini boleh dilakukan dengan mentakrifkan semula JSONEncoder.default() dalam modul yang diimport pada permulaan pakej.
Pensiri Automatik menggunakan Pickle
Penyelesaian yang lebih komprehensif melibatkan penggunaan modul jeruk untuk mengambil objek yang bukan jenis data JSON standard. Pendekatan ini membenarkan penyiaran automatik kebanyakan objek Python, termasuk contoh kelas yang ditentukan pengguna, tanpa memerlukan kaedah khas.
Penyahserikatan
Untuk menyahsiri objek jeruk, objek_cangkuk tersuai fungsi boleh diberikan kepada json.loads(). Fungsi ini akan membongkar objek dengan kekunci _python_object, memulihkannya kepada keadaan Python asalnya.
Kemudahalihan Python 3
Dalam Python 3, json.dumps() mengembalikan objek bait , yang memerlukan pengubahsuaian untuk serialisasi jeruk. Hasil pickle.dumps() boleh dinyahkod dalam latin1 dan kemudian dikodkan semula ke latin1 sebelum menggunakan pickle.loads().
Contoh
Pertimbangkan modul yang dipanggil make_json_serializable2 yang melaksanakan siri automatik berasaskan tampalan monyet dan jeruk:
<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>
Untuk menggunakan modul ini, hanya importnya dan siri akan digunakan secara automatik:
<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>
Pendekatan ini menyediakan kaedah yang mudah dan umum untuk menjadikan objek tersuai JSON boleh bersiri tanpa memerlukan pengekod tersuai manual.
Atas ialah kandungan terperinci Bagaimana untuk Membuat Objek Tersuai JSON Boleh Bersiri tanpa Pengekod Tersuai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!