Maison >développement back-end >Tutoriel Python >Comment rendre des objets personnalisés JSON sérialisables sans encodeurs personnalisés ?

Comment rendre des objets personnalisés JSON sérialisables sans encodeurs personnalisés ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 03:21:40296parcourir

How to Make Custom Objects JSON Serializable without Custom Encoders?

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!

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