找不到解決如何執行此操作的現有帖子:我有一個 JSON 陣列,例如
[{'completed': 0, 'content': 'do smtng', 'deadline': 'Mon, 22 Nov 2021 00:00:00 GMT', 'id': 4, 'user_id': 7}, .. .],
并希望將其轉換為 Task 物件的 Python 串列(來自我創建的 Task 類)。
我該怎么做呢?
uj5u.com熱心網友回復:
您要做的是將一個 json 物件反序列化為一個類,我確信有比這個更好的答案,但在這里。
第一步:將json陣列轉換為python串列
import json
# assuming it is a json object for now, you can loop through an do the same
json = {'completed': 0, 'content': 'do smtng', 'deadline': 'Mon, 22 Nov 2021 00:00:00 GMT', 'id': 4, 'user_id': 7}
job = json.loads(json)
第二步:將我們的串列轉換為一個類
關于如何做到這一點,這里并沒有真正達成共識。如果你的 json 已經用你的類的確切命名格式化,你可以嘗試像 attrs 這樣的庫,或者你可以做一些像這樣的手動操作:
import json
from dataclasses import dataclass
@dataclass
class Task:
completed: int
content: str
deadline: str
id: int
user_id: int
@classmethod
def from_dict(cls, dict):
return cls(completed=dict["completed"], content=dict["content"],
deadline=dict["deadline"], id=dict["id"],
user_id=dict["user_id"])
@classmethod
def from_json(cls, json_str: str):
return cls.from_dict(json.loads(json_str))
如果需要,您也可以在此處執行輸入驗證,但要盡量保持基本
uj5u.com熱心網友回復:
如果您可以使用外部庫,最簡單的解決方案是使用dataclassesPython 3.7 中的內置模塊以及用于(反)序列化目的的dataclass -wizard庫。
這是一個足夠簡單的示例,在這種情況下使用資料類對資料進行建模。請注意,我使用了一個新功能,模式化的日期和時間,將自定義模式字串反序列化為datetime物件。如果您想將資料保留為字串,則可以對其進行注釋deadline: str。我能夠在日期時間使用檔案中的格式代碼。
import json
from dataclasses import dataclass
from dataclass_wizard import fromlist, asdict, DateTimePattern
@dataclass
class Task:
completed: int
content: str
deadline: DateTimePattern['%a, %d %b %Y %H:%M:%S %Z']
id: int
user_id: int
list_of_dict = [
{'completed': 0, 'content': 'do smtng', 'deadline': 'Mon, 22 Nov 2021 00:00:00 GMT', 'id': 4, 'user_id': 7},
]
# De-serialize JSON data into a list of Task instances
list_of_tasks = fromlist(Task, list_of_dict)
print(list_of_tasks)
# Serialize list of Task instances
json_string = json.dumps([asdict(task) for task in list_of_tasks])
print(json_string)
輸出:
[Task(completed=0, content='do smtng', deadline=datetime.datetime(2021, 11, 22, 0, 0), id=4, user_id=7)]
[{"completed": 0, "content": "do smtng", "deadline": "2021-11-22T00:00:00", "id": 4, "userId": 7}]
為了讓事情更簡單,您可以選擇從JSONWizardMixin 類中創建子類。這里的主要好處是添加了一堆輔助類方法,例如list_to_json將資料類實體串列序列化為 JSON,這在這種情況下似乎很有用。這個例子類似于上面的例子;請注意,輸出在任何情況下都是相同的。
from dataclasses import dataclass
from dataclass_wizard import JSONWizard, DateTimePattern
@dataclass
class Task(JSONWizard):
completed: int
content: str
deadline: DateTimePattern['%a, %d %b %Y %H:%M:%S %Z']
id: int
user_id: int
list_of_dict = [
{'completed': 0, 'content': 'do smtng', 'deadline': 'Mon, 22 Nov 2021 00:00:00 GMT', 'id': 4, 'user_id': 7},
]
# De-serialize JSON data into a list of Task instances
list_of_tasks = Task.from_list(list_of_dict)
print(list_of_tasks)
# Serialize list of Task instances
json_string = Task.list_to_json(list_of_tasks)
print(json_string)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368769.html
