基本上我有一個預訂類,每個欄位都是手動宣告的。我很好奇給定任務是否有更簡潔的解決方案。
class Booking:
def __init__(self, json_data):
self.referenceNumber = json_data["referenceNumber"]
self.fromDate = json_data["fromDate"]
self.preferredDate1 = json_data["preferredDate1"]
self.preferredTimeFrom = json_data["preferredTimeFrom"]
self.time = json_data["time"]
self.partySize = json_data["partySize"]
self.budgetAmountTotal = json_data["budgetAmountTotal"]
self.budgetAmountPerPerson = json_data["budgetAmountPerPerson"]
self.budgetCurrencySign = json_data["budgetCurrencySign"]
self.venueName = json_data["venueName"]
self.venueId = json_data["venueId"]
self.cityName = json_data["cityName"]
self.clientName = json_data["clientName"]
self.clientContactName = json_data["clientContactName"]
self.status = json_data["status"]
self.statusText = json_data["statusText"]
self.assigneeId = json_data["assigneeId"]
self.assignee = json_data["assignee"]
self.lastAction = json_data["lastAction"]
self.inquiryChannel = json_data["inquiryChannel"]
self.venueDateFormat = json_data["venueDateFormat"]
self.bookingId = json_data["bookingId"]
self.inquiryHold = json_data["inquiryHold"]
self.isSpaceSelectedForHolds = json_data["isSpaceSelectedForHolds"]
self.id = json_data["id"]
如果我在呼叫該屬性時沒有收到未解決的參考警告,則會得到獎勵。
uj5u.com熱心網友回復:
一個簡單self.__dict__.update(json_data)的可能會成功。
uj5u.com熱心網友回復:
鑒于問題中的代碼,對屬性的訪問將采用以下樣式:
Booking().fromDate
但是,如果您不介意通過鍵名訪問該值,那么您可以大大簡化代碼,如下所示:
class Booking:
def __init__(self, json_data):
self._json = json.data
def __getitem__(self, key):
return self._json.get(key)
然后(例如)...
pd = {'fromDate': '2022/10/18'}
print(Booking(pd)['fromDate'])
uj5u.com熱心網友回復:
這個怎么樣?
def set_attr_from_json(obj, json_data):
for key, value in json_data.items():
setattr(obj, key, value)
class Booking:
def __init__(self, json_data):
set_attr_from_json(self, json_data)
uj5u.com熱心網友回復:
既然你想控制你的類屬性應該如何構建,我認為你應該metaclass像這樣使用
import json
from types import SimpleNamespace
class BookingMeta(type):
def __call__(self, json_data):
obj = super().__call__(json_data)
obj = json.loads(json.dumps(json_data), object_hook=lambda d: SimpleNamespace(**d))
return obj
class Booking(metaclass=BookingMeta):
def __init__(self, json_data):
pass
b = Booking({"name": {"first_name": "hello", "last_name": "world"}, "age": 23, "sub": ["maths", "Science"]})
print(b.name.first_name)
print(b.age)
#hello
#23
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516859.html
標籤:Pythonjson
