Dacă nu vă deranjează să instalați un pachet pentru acesta, puteți utiliza json-tricks:
pip install json-tricks
După aceea, trebuie doar să importați dump(s) din json_tricks în loc de json și, de obicei, va funcționa:
from json_tricks import dumps
json_str = dumps(cls_instance, indent=4)
care va da
{
"__instance_type__": [
"module_name.test_class",
"MyTestCls"
],
"attributes": {
"attr": "val",
"dct_attr": {
"hello": 42
}
}
}
Și practic asta este!
Acest lucru va funcționa grozav în general. Există câteva excepții, de ex. dacă se întâmplă lucruri speciale în __new__, sau mai multă magie metaclasă se întâmplă.
Evident, funcționează și încărcarea (altfel ce rost are):
from json_tricks import loads
json_str = loads(json_str)
Aceasta presupune că module_name.test_class.MyTestCls poate fi importat și nu s-a schimbat în moduri necompatibile. Veți primi înapoi o instanță, nu un dicționar sau ceva de genul, și ar trebui să fie o copie identică cu cea pe care ați aruncat-o.
Dacă doriți să personalizați modul în care ceva este (de)serializat, puteți adăuga metode speciale la clasa dvs., cum ar fi:
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
care serializează doar o parte din parametrii atributelor, de exemplu.
Și ca bonus gratuit, obțineți (de)serializarea matricelor numpy, date și ore, hărți ordonate, precum și posibilitatea de a include comentarii în json.
Disclaimer: am creat json_tricks, deoarece am avut aceeași problemă ca și dvs.
person
Mark
schedule
10.11.2016
import jsonsvezi răspunsul de mai jos - funcționează perfect - person tswaehn   schedule 02.04.2020.to_dict()sau ceva care poate fi apelat pe obiect înainte de a fi transmis modulului care încearcă să-l serializeze. - person Felix B.   schedule 01.09.2020varsîn combinație cujson.dumps(vezi răspunsul meu stackoverflow.com/a/64469761/1587520 ) - person user1587520   schedule 23.11.2020