Jika Anda tidak keberatan menginstal paket untuk itu, Anda dapat menggunakan json-trik :
pip install json-tricks
Setelah itu Anda hanya perlu mengimpor dump(s)
dari json_tricks
bukan json, dan biasanya akan berfungsi:
from json_tricks import dumps
json_str = dumps(cls_instance, indent=4)
yang akan memberi
{
"__instance_type__": [
"module_name.test_class",
"MyTestCls"
],
"attributes": {
"attr": "val",
"dct_attr": {
"hello": 42
}
}
}
Dan pada dasarnya itu!
Ini akan bekerja dengan baik pada umumnya. Ada beberapa pengecualian, misalnya jika terjadi hal-hal khusus __new__
, atau lebih banyak keajaiban metaclass terjadi.
Jelas memuat juga berfungsi (jika tidak apa gunanya):
from json_tricks import loads
json_str = loads(json_str)
Ini mengasumsikan yang module_name.test_class.MyTestCls
dapat diimpor dan tidak berubah dengan cara yang tidak kompatibel. Anda akan mendapatkan kembali sebuah instance , bukan kamus atau sejenisnya, dan itu harus merupakan salinan yang identik dengan yang Anda buang.
Jika Anda ingin mengkustomisasi bagaimana sesuatu mendapat (de) serial, Anda dapat menambahkan metode khusus ke kelas Anda, seperti:
class CustomEncodeCls:
def __init__(self):
self.relevant = 42
self.irrelevant = 37
def __json_encode__(self):
# should return primitive, serializable types like dict, list, int, string, float...
return {'relevant': self.relevant}
def __json_decode__(self, **attrs):
# should initialize all properties; note that __init__ is not called implicitly
self.relevant = attrs['relevant']
self.irrelevant = 12
yang membuat cerita bersambung hanya sebagian dari parameter atribut, sebagai contoh.
Dan sebagai bonus gratis, Anda mendapatkan (de) serialisasi array numpy, tanggal & waktu, peta yang dipesan, serta kemampuan untuk memasukkan komentar di json.
Penafian: Saya membuat json_tricks , karena saya memiliki masalah yang sama dengan Anda.