Maison  >  Article  >  développement back-end  >  Comment surmonter les limitations de sérialisation JSON par défaut avec des méthodes personnalisées ?

Comment surmonter les limitations de sérialisation JSON par défaut avec des méthodes personnalisées ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-31 03:46:31665parcourir

How to Overcome Default JSON Serialization Limitations with Custom Methods?

Surmonter les limitations de sérialisation par défaut avec des méthodes personnalisées

Dans la sérialisation JSON par défaut, l'utilisation du JSONEncoder intégré est souvent l'approche la plus pratique. Cependant, pour les objets personnalisés qui n'héritent pas de types sérialisables, cela peut être difficile.

Monkey-Patching the Default Encoder

Au lieu de sous-classer JSONEncoder, nous pouvons modifiez son comportement en modifiant la méthode par défaut à l'aide de Monkey-Patching. Cela nous permet d'ajouter une logique spéciale qui recherche une méthode to_json dans l'objet et l'utilise pour l'encodage si disponible.

Exemple : Utilisation d'une méthode spéciale pour la sérialisation

<code class="python">import json

# Module for monkey-patching
def _default(self, obj):
    return getattr(obj.__class__, "to_json", _default.default)(obj)

_default.default = JSONEncoder.default
JSONEncoder.default = _default

class Foo:
    def __init__(self, name):
        self.name = name
    def to_json(self):
        return '{&quot;name&quot;: &quot;%s&quot;}' % self.name

foo = Foo('sazpaz')
json_str = json.dumps(foo)</code>

Cette approche nous permet de sérialiser des objets personnalisés sans avoir à implémenter d'encodeurs personnalisés.

Automatiser la sérialisation avec Pickle

Pour encore plus de flexibilité, nous pouvons utiliser le module pickle en conjonction avec le patching des singes. En créant une méthode par défaut personnalisée qui sélectionne les types JSON non standard, nous pouvons les sérialiser automatiquement.

<code class="python"># Module for pickle-based serialization
from json import JSONEncoder
import pickle

def _default(self, obj):
    return {'_python_object': pickle.dumps(obj)}

JSONEncoder.default = _default</code>

Cela nous permet de sérialiser les classes définies par l'utilisateur, y compris les structures de données complexes.

Remarque : Pour la désérialisation, nous pouvons fournir un object_hook personnalisé pour reconstruire les objets Python à partir des données marinées.

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