Maison  >  Article  >  développement back-end  >  Comment puis-je rendre des objets personnalisés JSON sérialisables à l'aide de l'encodeur par défaut en Python ?

Comment puis-je rendre des objets personnalisés JSON sérialisables à l'aide de l'encodeur par défaut en Python ?

DDD
DDDoriginal
2024-10-31 00:26:03953parcourir

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

Rendre des objets JSON sérialisables avec l'encodeur par défaut

La méthode par défaut pour sérialiser des objets personnalisés non sérialisables en JSON implique de sous-classer json.JSONEncoder et de transmettre un encodeur personnalisé à json.dumps(). Cela donne généralement un code qui ressemble à ceci :

<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>

Cependant, que se passe-t-il si vous souhaitez rendre un objet sérialisable à l'aide de l'encodeur par défaut ? Malheureusement, il n'existe pas de solution simple proposée par le module json.

Utilisation de Monkey-Patching pour le codage par défaut

Malgré les limitations du module json, il est possible d'obtenir la fonctionnalité souhaitée grâce à une technique appelée patch de singe. Cela implique de modifier le comportement par défaut du module json en remplaçant sa méthode default().

En créant un module qui modifie la méthode JSONEncoder.default(), toutes les opérations de sérialisation JSON ultérieures seront affectées, car les modules sont mis en cache dans sys.modules. Le module autonome suivant montre comment implémenter ce patch singe :

<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>

Pour utiliser ce module patché par singe, importez-le simplement et il appliquera automatiquement les modifications au module json.

Ajout d'une méthode spéciale pour la sérialisation des objets

Pour activer la sérialisation JSON automatique de vos classes personnalisées, vous pouvez définir une méthode spéciale appelée __json__ en leur sein. Le JSONEncoder recherchera cette méthode et utilisera sa valeur de retour pour la sérialisation. Cela évite le besoin de méthodes to_json() explicites.

Sérialisation d'objets Python avec Pickle

Une autre approche de la sérialisation automatique consiste à utiliser le module pickle en conjonction avec le JSONEncoder patché par singe. En remplaçant la méthode default() pour décaper les objets Python qui ne sont pas des types JSON standard, vous pouvez réaliser la sérialisation sans avoir besoin de méthodes de classe spéciales.

Désérialisation avec pickle

Pour reconstruire le Python original objets de la représentation JSON produite par la sérialisation basée sur pickle, vous pouvez fournir une fonction object_hook personnalisée pendant la désérialisation. Cette fonction peut détecter la clé '_python_object' ajoutée lors de la sérialisation et l'utiliser pour reconstruire l'objet d'origine à l'aide de pickle.loads().

Conclusion

Bien que le module json ne fournisse pas de réponse directe moyen de rendre les objets JSON sérialisables avec l'encodeur par défaut, il est possible d'y parvenir via le patch singe ou en utilisant le module pickle. L'approche pickle permet la sérialisation automatique de la plupart des objets Python, ce qui en fait une solution plus généralisée.

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!

Déclaration:
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