Rendre des objets personnalisés JSON sérialisables sans implémenter d'encodeurs personnalisés
Le mécanisme de sérialisation JSON par défaut en Python implique la création d'une sous-classe personnalisée de json.JSONEncoder pour gérer des objets non sérialisables. Bien que cette approche soit largement utilisée, elle peut s'avérer fastidieuse pour les utilisateurs qui souhaitent rendre leurs classes sérialisables en JSON sans modifier le code de l'appelant.
Pour résoudre ce problème, une solution potentielle consiste à exploiter la technique de patch singe de Python. Cela implique de modifier le comportement des modules existants en modifiant leur code source au moment de l'exécution. Dans ce cas, nous pouvons modifier la méthode JSONEncoder.default() du module json pour rechercher une méthode spéciale "to_json" dans l'objet en cours de sérialisation. Si une telle méthode existe, elle peut être utilisée pour générer une représentation JSON de l'objet.
Pour implémenter cette approche, créez un module (par exemple, make_json_serializing.py) avec le code suivant :
<code class="python">from json import JSONEncoder def _default(self, obj): return getattr(obj.__class__, "to_json", _default.default)(obj) _default.default = JSONEncoder.default # Save unmodified default. JSONEncoder.default = _default # Replace it.</code>
Ce code modifie la méthode JSONEncoder.default() pour rechercher une méthode "to_json" dans l'objet en cours de sérialisation. Si elle est trouvée, la méthode sera utilisée pour générer une représentation JSON. Sinon, le comportement par défaut sera utilisé.
Pour utiliser ce module, importez-le simplement avant toute opération de sérialisation JSON pour appliquer le patch singe :
<code class="python">import make_json_serializable</code>
Maintenant, tout objet avec un La méthode "to_json" sera sérialisée à l'aide de cette méthode sans avoir besoin d'encodeurs personnalisés.
Cependant, cette approche nécessite toujours que les utilisateurs implémentent un "to_json" personnalisé. méthode pour chaque classe qu'ils souhaitent rendre JSON sérialisable. Une solution alternative qui offre plus de flexibilité consiste à utiliser le module pickle pour sérialiser et désérialiser automatiquement les objets.
En appliquant des correctifs singe à la méthode JSONEncoder.default() pour décaper les types de données JSON non standard, nous pouvons éliminer le besoin de méthodes de sérialisation personnalisées. Cependant, le processus de désérialisation nécessite une fonction object_hook personnalisée pour gérer les objets décapés.
Cette approche fournit un moyen plus propre et plus générique de rendre les objets personnalisés JSON sérialisables sans nécessiter de modifications de code de la part de l'appelant.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!