Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh membuat objek tersuai JSON boleh bersiri menggunakan pengekod lalai dalam Python?

Bagaimanakah saya boleh membuat objek tersuai JSON boleh bersiri menggunakan pengekod lalai dalam Python?

DDD
DDDasal
2024-10-31 00:26:03953semak imbas

How can I make custom objects JSON serializable using the default encoder in Python?

Menjadikan Objek JSON Boleh Diseri dengan Pengekod Lalai

Kaedah lalai untuk mensiri objek tersuai, tidak boleh bersiri kepada JSON melibatkan subkelas json.JSONEncoder dan menghantar pengekod tersuai kepada json.dumps(). Ini biasanya menghasilkan kod yang kelihatan seperti ini:

<code class="python">class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Foo):
            return obj.to_json()

        return json.JSONEncoder.default(self, obj)

print(json.dumps(obj, cls=CustomEncoder))</code>

Walau bagaimanapun, bagaimana jika anda ingin menjadikan objek boleh bersiri menggunakan pengekod lalai? Malangnya, tiada penyelesaian mudah yang ditawarkan oleh modul json.

Menggunakan Monkey-Patching untuk Pengekodan Lalai

Walaupun terdapat batasan modul json, adalah mungkin untuk mencapai kefungsian yang diingini melalui teknik yang dipanggil tampalan monyet. Ini melibatkan pengubahsuaian kelakuan lalai modul json dengan menggantikan kaedah lalai()nya.

Dengan mencipta modul yang mengubah suai kaedah JSONEncoder.default(), semua operasi bersiri JSON berikutnya akan terjejas, kerana modul adalah dicache dalam sys.modules. Modul kendiri berikut menunjukkan cara untuk melaksanakan tampalan monyet ini:

<code class="python">import json

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

_default.default = JSONEncoder.default
JSONEncoder.default = _default</code>

Untuk menggunakan modul tampalan monyet ini, hanya importnya dan ia akan menggunakan perubahan secara automatik pada modul json.

Menambah Kaedah Khas untuk Pensirian Objek

Untuk mendayakan pensirilan JSON automatik bagi kelas tersuai anda, anda boleh menentukan kaedah khas yang dipanggil __json__ di dalamnya. JSONEncoder akan menyemak kaedah ini dan menggunakan nilai pulangannya untuk bersiri. Ini mengelakkan keperluan untuk kaedah to_json() yang eksplisit.

Menyerikan Objek Python dengan Pickle

Satu lagi pendekatan untuk bersiri automatik ialah menggunakan modul jeruk bersama-sama dengan JSONEncoder yang ditampal monyet. Dengan mengatasi kaedah lalai() untuk memetik objek Python yang bukan jenis JSON standard, anda boleh mencapai penyirian tanpa memerlukan kaedah kelas khas.

Penyahserilan dengan jeruk

Untuk membina semula Python asal objek daripada perwakilan JSON yang dihasilkan oleh siri berasaskan jeruk, anda boleh menyediakan fungsi object_hook tersuai semasa penyahserikatan. Fungsi ini boleh mengesan kekunci '_python_object' yang ditambahkan semasa penyirian dan menggunakannya untuk membina semula objek asal menggunakan pickle.loads().

Kesimpulan

Walaupun modul json tidak menyediakan langsung cara untuk menjadikan objek JSON boleh bersiri dengan pengekod lalai, adalah mungkin untuk mencapainya melalui tampalan monyet atau dengan menggunakan modul jeruk. Pendekatan acar membolehkan penyirian automatik kebanyakan objek Python, menjadikannya penyelesaian yang lebih umum.

Atas ialah kandungan terperinci Bagaimanakah saya boleh membuat objek tersuai JSON boleh bersiri menggunakan pengekod lalai dalam Python?. 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