Switchboard erleichtert die Arbeit mit APIs. Mit Switchboard können Sie JSON-Schemas einfach konvertieren. Indem Sie ein Switchboard erstellen und einige Cords definieren, können Sie verwalten, welche Felder des alten Schemas welche Felder im neuen Schema implizieren.
Der Name Switchboard ist eine Vereinigung alter Telefonanbieter. Durch die Nutzung der Telefonzentrale fungieren Sie als Bediener. Das Verknüpfen von Schemafeldern miteinander ähnelt der Telefonzentrale eines Telefonisten. Foto von Gawler History.
Wenn Sie beispielsweise mit Integrationen und APIs von Drittanbietern arbeiten, kommt es häufig vor, dass die Daten manuell ermittelt werden müssen. Nehmen wir an, dass Sie über die folgende Art eines einfachen Datenbankschemas verfügen:
Column | Type ---------------+------- first_name | string last_name | string email | string
Sie arbeiten beispielsweise mit der Benutzer-API eines Drittanbieters, die die folgende Art von Nutzlast zurückgibt:
{ „id“: 12335, „firstName“: „John“, „lastName“: „Doe“, „contactInfo“: {“primaryEmail“: „[email protected]“ } }
Was also jetzt tun? Was ist der beste Weg, Nutzdaten in Ihr eigenes Format zu konvertieren? Kommt Ihnen das bekannt vor:
Response_dict = json.loads(response.body)data = {"first_name": Response_dict.get("firstName"),"last_name": Response_dict.get("lastName"),"email": Response_dict.get("contactInfo" , {}).get("primaryEmail") }
Leider wird die obige Lösung äußerst chaotisch, wenn mit verschachtelten JSON-Strukturen, mehreren APIs von Drittanbietern oder einer Kombination davon gearbeitet wird. Aus diesem Grund ist Switchboard nützlich. Durch die Definition eines neuen Switchboards können Sie Datenzuordnungen zwischen verschiedenen Schemata einfach verwalten.
aus dem Switchboard-Import Switchboard, Cordclass UserSwitchboard(Switchboard):first_name = Cord("firstName")last_name = Cord("lastName")email = Cord(["contactInfo", "primaryEmail"]) # Beachten Sie, wie einfach der verschachtelte Zugriff ist Daten!
Jetzt sieht der Code viel besser aus. Hübsch!
Response_dict = json.loads(response.body)data = UserSwitchboard().apply(response_dict)
Dieses Projekt ist noch in Bearbeitung. Eine bessere Dokumentation folgt später.
Das Definieren neuer Switchboards ist einfach. Sie müssen es lediglich importieren und einige Akkorde definieren.
aus Switchboard-Import Switchboard, Cordclass MySwitchboard(Switchboard):pet_name = Cord(source="petName", # Quelle gibt Feldposition im Quellschema anrequired=True, # Wenn das Feld erforderlich ist und fehlt, wird eine Ausnahme ausgelöstdefault="Mr. Dog" # Wenn das Feld fehlt, wird der Standardwert verwendet)
Die Switchboard-Funktionalität kann mithilfe der Meta-Klasse optimiert werden:
aus Switchboard-Import Switchboard, Cordclass MySwitchboard(Switchboard):class Meta:# Gibt an, was mit fehlenden Feldern zu tun ist. Die Standardfunktionalität ist INCLUDE,#, was bedeutet, dass, wenn das Quellfeld fehlt, das Feld angehängt wird, der Feld#-Wert jedoch Nonemissing = Switchboard.EXCLUDE # Optionen: Switchboard.EXCLUDE | ist Switchboard.INCLUDE | Switchboard.RAISEpet_name = Cord("petName")
Cords können auf verschachtelte Felder und sogar Listen zugreifen.
aus Switchboard-Import Switchboard, Cordclass MySwitchboard(Switchboard):target_field = Cord(source=["field1", # Entspricht Feldschlüssel0, # Entspricht Listenindex"field2" # Entspricht Feldschlüssel] )MySwitchboard().apply({ "field1": [{ "field2": "value" }] })# > { "target_field": "value" }
Das Switchboard- many
-Attribut hilft beim Umgang mit Listen. Zum Beispiel:
Klasse MySwitchboard(Switchboard):target = Cord("source")data_in = [ {"Quelle": 1}, {"Quelle": 2}, {"Quelle": 3}, {"Quelle": 4} ]MySwitchboard(many=True).apply(data_in)# > [{ "target": 1 }, { "target": 2 }, { "target": 3 }, {"target": 4 }]