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 ?
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.
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.
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.
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.
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().
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!