スイッチボードを使用すると、API の操作が簡単になります。 Switchboard を使用すると、JSON スキーマを簡単に変換できます。スイッチボードを作成し、いくつかのコードを定義することで、古いスキーマのどのフィールドが新しいスキーマのどのフィールドに影響するかを管理できます。
Switchboard という名前は、昔ながらの電話交換手の団体です。 Switchboard を使用すると、あなたはオペレーターとして機能します。スキーマ フィールドを相互にリンクすることは、電話交換手の交換台に似ています。写真提供:Gawler History
たとえば、統合やサードパーティ API を使用している場合、データを手動で掘り出さなければならない状況に遭遇することがよくあります。次のような単純なデータベース スキーマがあるとします。
Column | Type ---------------+------- first_name | string last_name | string email | string
たとえば、次の種類のペイロードを返すサードパーティ ユーザー API を使用しているとします。
{ "id": 12335, "firstName": "John", "lastName": "Doe", "contactInfo": {"primaryEmail": "[email protected]" } }
それで、今何をすべきでしょうか?ペイロードを独自の形式に変換する最良の方法は何ですか?これには見覚えがあるでしょうか:
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("プライマリメール") }
残念ながら、入れ子になった JSON 構造、複数のサードパーティ API、またはそれらの組み合わせを操作する場合、上記の解決策は非常に面倒になります。これがスイッチボードが役立つ理由です。新しいスイッチボードを定義することで、異なるスキーマ間のデータ マッピングを簡単に管理できます。
from switchboard import Switchboard, Cordclass UserSwitchboard(Switchboard):first_name = Cord("firstName")last_name = Cord("lastName")email = Cord(["contactInfo", "primaryEmail"]) # ネストされたアクセスがいかに簡単であるかに注目してくださいデータ!
これで、コードの見た目が大幅に良くなりました。ニース!
response_dict = json.loads(response.body)data = UserSwitchboard().apply(response_dict)
このプロジェクトはまだ進行中です。より良いドキュメントは後で公開されます。
新しいスイッチボードの定義は簡単です。必要なのは、それをインポートし、いくつかのコードを定義することだけです。
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):pet_name = Cord(source="petName", # ソースはソース内のフィールドの位置を伝えます schemarequired=True, # フィールドが必須で欠落している場合、例外が発生しますdefault="Mr. Dog" #フィールドが欠落している場合は、デフォルト値が使用されます)
スイッチボードの機能は、メタ クラスを使用して調整できます。
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):class Meta:# 欠落しているフィールドをどうするかを指示します。デフォルトの機能は INCLUDE,# です。これは、ソース フィールドが欠落している場合、フィールドは追加されますが、field# の値は Nonemissing = Switchboard.EXCLUDE になることを意味します。 # オプション: Switchboard.EXCLUDE |配電盤.INCLUDE | Switchboard.RAISEpet_name = Cord("petName")
コードは、ネストされたフィールドやリストにもアクセスできます。
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):target_field = Cord(source=["field1", # フィールド key0 に一致, # リストのインデックス "field2" に一致 # フィールド key に一致] )MySwitchboard().apply({ "フィールド 1": [{ "フィールド 2": "値" }] })# > { "ターゲット フィールド": "値" }
Switchboard many
属性はリストの処理に役立ちます。例えば:
class MySwitchboard(Switchboard):target = Cord("source")data_in = [ {"ソース": 1}, {"ソース": 2}, {"ソース": 3}, {"ソース": 4} ]MySwitchboard(many=True).apply(data_in)# > [{ "ターゲット": 1 }, { "ターゲット": 2 }, { "ターゲット": 3 }, {"ターゲット": 4 }]