Comment puis-je rendre les objets personnalisés JSON sérialisables en Python sans implémenter d'encodeurs personnalisés ?

Barbara Streisand
Libérer: 2024-10-31 10:19:02
original
347 Les gens l'ont consulté

How can I make custom objects JSON serializable in Python without implementing custom encoders?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal