สวิตช์บอร์ดทำให้การทำงานกับ API เป็นเรื่องง่าย สวิตช์บอร์ดช่วยให้คุณแปลงสคีมา JSON ได้อย่างง่ายดาย ด้วยการสร้างสวิตช์บอร์ดและกำหนดสายบางสาย คุณสามารถจัดการได้ว่าฟิลด์ใดของสคีมาเก่าจะบ่งบอกว่าฟิลด์ใดในสคีมาใหม่
ชื่อ Switchboard มาจากสมาคมผู้ให้บริการโทรศัพท์ในสมัยก่อน โดยการใช้สวิตช์บอร์ด คุณทำหน้าที่เป็นผู้ดำเนินการ การเชื่อมโยงฟิลด์สคีมาเข้าด้วยกันจะคล้ายกับสวิตช์บอร์ดของผู้ให้บริการโทรศัพท์ ภาพถ่ายโดยประวัติ Gawler
เมื่อทำงานกับการผสานรวมและ 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("primaryEmail") -
น่าเสียดายที่โซลูชันข้างต้นยุ่งเหยิงอย่างยิ่งเมื่อทำงานกับโครงสร้าง JSON ที่ซ้อนกัน, API ของบุคคลที่สามหลายรายการ หรือทั้งสองอย่างรวมกัน นี่คือเหตุผลที่สวิตช์บอร์ดมีประโยชน์ โดยการกำหนดสวิตช์บอร์ดใหม่ คุณสามารถจัดการการแมปข้อมูลระหว่างสคีมาต่างๆ ได้อย่างง่ายดาย
จาก 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)
โครงการนี้ยังอยู่ในระหว่างดำเนินการ เอกสารที่ดีกว่าจะมาในภายหลัง
การกำหนดสวิตช์บอร์ดใหม่เป็นเรื่องง่าย สิ่งที่คุณต้องทำคือนำเข้ามันและกำหนดคอร์ดบางส่วน
จากการนำเข้าสวิตช์บอร์ด Switchboard, Cordclass MySwitchboard(Switchboard):pet_name = Cord(source="petName", # Source บอกตำแหน่งของฟิลด์ใน source schemarequired=True, # หากจำเป็นต้องระบุฟิลด์และขาดหายไป, ข้อยกเว้นจะถูกยกขึ้นdefault="Mr. Dog" # หากไม่มีฟิลด์ แสดงว่ามีการใช้ค่าเริ่มต้น)
ฟังก์ชั่นสวิตช์บอร์ดสามารถปรับแต่งได้โดยใช้คลาส Meta:
จากสวิตช์บอร์ด นำเข้าสวิตช์บอร์ด Cordclass MySwitchboard(Switchboard):class Meta:# บอกสิ่งที่ต้องทำกับฟิลด์ที่ขาดหายไป ฟังก์ชันเริ่มต้นคือ INCLUDE,# ซึ่งหมายความว่าหากไม่มีฟิลด์ต้นฉบับ ฟิลด์จะถูกต่อท้าย แต่ค่าของฟิลด์ # จะเป็นไม่มีหายไป = Switchboard.EXCLUDE # ตัวเลือก: Switchboard.EXCLUDE | สวิตช์บอร์ดรวม | Switchboard.RAISEpet_name = Cord("petName")
สายไฟสามารถเข้าถึงฟิลด์ที่ซ้อนกันหรือรายการได้
จากสวิตช์บอร์ดนำเข้าสวิตช์บอร์ด, Cordclass MySwitchboard(Switchboard):target_field = Cord(source=["field1", # Matches to field key0, # Matches to list index"field2" # Matches to field key] )MySwitchboard().apply({ "field1": [{ "field2": "value" }] })# > { "target_field": "value" }
คุณสมบัติ many
ของสวิตช์บอร์ดช่วยในการจัดการกับรายการ ตัวอย่างเช่น:
คลาส MySwitchboard (สวิตช์บอร์ด): เป้าหมาย = สายไฟ ("แหล่งที่มา") data_in = [ {"แหล่งที่มา": 1}, {"แหล่งที่มา": 2}, {"แหล่งที่มา": 3}, {"แหล่งที่มา": 4} ]MySwitchboard(many=True).apply(data_in)# > [{ "target": 1 }, { "target": 2 }, { "target": 3 }, {"target": 4 }]