Maison > Article > développement back-end > Comment rendre des objets personnalisés JSON sérialisables sans encodeurs personnalisés ?
Rendre des objets personnalisés JSON sérialisables sans encodeurs personnalisés
La sérialisation JSON personnalisée d'objets non sérialisables implique généralement d'étendre json.JSONEncoder et d'ajouter un encodeur vers json.dumps(). Cependant, il est possible de rendre des objets sérialisables à l'aide de l'encodeur par défaut, éliminant ainsi le besoin d'encodeurs personnalisés triviaux.
Monkey-Patching l'encodeur par défaut
L'encodeur par défaut peut être modifié (patché par singe) pour rechercher une méthode spéciale dans les objets, telle que to_json(), et l'utiliser pour la sérialisation. Cela peut être fait en redéfinissant JSONEncoder.default() dans un module importé lors de l'initialisation du package.
Sérialisation automatique à l'aide de Pickle
Une solution plus complète implique l'utilisation du module pickle pour récupérer des objets qui ne sont pas des types de données JSON standard. Cette approche permet la sérialisation automatique de la plupart des objets Python, y compris les instances de classe définies par l'utilisateur, sans nécessiter de méthodes spéciales.
Désérialisation
Pour désérialiser les objets marinés, un object_hook personnalisé la fonction peut être fournie à json.loads(). Cette fonction décaperait les objets avec les clés _python_object, les restaurant à leur état Python d'origine.
Portabilité Python 3
Dans Python 3, json.dumps() renvoie des objets bytes , qui nécessitent une modification pour la sérialisation des cornichons. Le résultat pickle.dumps() peut être décodé en latin1 puis recodé en latin1 avant d'utiliser pickle.loads().
Exemple
Considérons un module appelé make_json_serializing2 qui implémente la sérialisation automatique basée sur les patchs singe et les cornichons :
<code class="python">from json import JSONEncoder import pickle def _default(self, obj): return {'_python_object': pickle.dumps(obj).decode('latin1')} JSONEncoder.default = _default # Replace the default method.</code>
Pour utiliser ce module, importez-le simplement et la sérialisation sera automatiquement appliquée :
<code class="python">import make_json_serializable2 # Custom class 'Foo' is now implicitly JSON serializable class Foo: def __init__(self, name): self.name = name # Serialize and deserialize using the default JSON encoder data = [Foo('Bar')] json_string = json.dumps(data) data2 = json.loads(json_string) print(data2 == data) # True</code>
Cette approche fournit une méthode simple et généralisée pour rendre les objets personnalisés JSON sérialisables sans avoir besoin d'encodeurs personnalisés manuels.
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!