Switchboard facilite le travail avec les API. Switchboard vous aide à convertir facilement les schémas JSON. En créant un standard et en définissant quelques cordons, vous pouvez gérer quels champs de l'ancien schéma impliquent quels champs du nouveau schéma.
Le nom Switchboard est une association d'opérateurs téléphoniques d'antan. En utilisant le Standard, vous agissez en tant qu'opérateur. La liaison des champs de schéma les uns aux autres ressemble au standard d'un opérateur téléphonique. Photo de Gawler Histoire.
Lorsque vous travaillez avec des intégrations et des API tierces, par exemple, vous vous retrouvez souvent dans une situation où les données doivent être extraites manuellement. Considérons que vous disposez du type de schéma de base de données simple suivant :
Column | Type ---------------+------- first_name | string last_name | string email | string
Vous travaillez par exemple avec une API utilisateur tierce, qui renvoie le type de charge utile suivant :
{ "id": 12335, "firstName": "John", "lastName": "Doe", "contactInfo": {"primaryEmail": "[email protected]" } }
Alors, que faire maintenant ? Quelle est la meilleure façon de convertir la charge utile dans votre propre format ? Est-ce que cela vous semble familier :
réponse_dict = json.loads(response.body)data = {"first_name": réponse_dict.get("firstName"),"last_name": réponse_dict.get("lastName"),"email": réponse_dict.get("contactInfo" , {}).get("primaryEmail") }
Malheureusement, la solution ci-dessus devient extrêmement compliquée lorsque vous travaillez avec des structures JSON imbriquées, plusieurs API tierces ou une combinaison de celles-ci. C'est pourquoi Switchboard est utile, en définissant un nouveau standard, vous pouvez facilement gérer les mappages de données entre différents schémas.
depuis l'importation du standard Switchboard, Cordclass UserSwitchboard(Switchboard):first_name = Cord("firstName")last_name = Cord("lastName")email = Cord(["contactInfo", "primaryEmail"]) # Remarquez à quel point il est simple d'accéder aux imbriqués données!
Maintenant, le code est bien meilleur. Bon!
réponse_dict = json.loads(response.body)data = UserSwitchboard().apply(response_dict)
Ce projet est toujours en cours. Une meilleure documentation viendra plus tard.
Définir de nouveaux standards est simple. Tout ce que vous avez à faire est de l'importer et de définir quelques accords.
depuis l'importation du standard Switchboard, Cordclass MySwitchboard(Switchboard):pet_name = Cord(source="petName", # La source indique l'emplacement du champ dans la source schemarequired=True, # Si le champ est obligatoire et manquant, l'exception est levée par défaut="Mr. Dog" # Si le champ est manquant, la valeur par défaut est utilisée)
La fonctionnalité du standard peut être modifiée à l'aide de la classe Meta :
à partir de l'importation du standard Switchboard, Cordclass MySwitchboard(Switchboard):class Meta:# Indique quoi faire avec les champs manquants. La fonctionnalité par défaut est INCLUDE,# ce qui signifie que si le champ source est manquant, le champ est ajouté mais la valeur du champ# sera Nonemissing = Switchboard.EXCLUDE # Options : Switchboard.EXCLUDE | Standard.INCLURE | Switchboard.RAISEpet_name = Cord("petName")
Les cordons peuvent accéder aux champs imbriqués, même aux listes.
depuis l'importation du standard Switchboard, Cordclass MySwitchboard(Switchboard):target_field = Cord(source=["field1", # Correspond à la clé du champ0, # Correspond à l'index de la liste "field2" # Correspond à la clé du champ] )MySwitchboard().apply({ "field1": [{ "field2": "value" }] })# > { "target_field": "value" }
many
attributs du Switchboard aident à gérer les listes. Par exemple:
class MySwitchboard(Switchboard):target = Cord("source")data_in = [ {"source": 1}, {"source": 2}, {"source": 3}, {"source": 4} ]MySwitchboard(many=True).apply(data_in)# > [{ "target": 1 }, { "target": 2 }, { "target": 3 }, {"target": 4 }]