Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Membuat Objek Tersuai JSON Boleh Bersiri tanpa Pengekod Tersuai?

Bagaimana untuk Membuat Objek Tersuai JSON Boleh Bersiri tanpa Pengekod Tersuai?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 03:21:40226semak imbas

How to Make Custom Objects JSON Serializable without Custom Encoders?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn