如果您可以使用外部库,最简单的解决方案是使用 Python 3.7+ 中的内置 dataclasses 模块以及用于(反)序列化目的的 dataclass-wizard 库。
这是一个足够简单的示例,在这种情况下使用数据类对您的数据进行建模。请注意,我正在使用新功能patterned date and time 将自定义模式字符串反序列化为datetime 对象。如果要将数据保留为字符串,则可以像 deadline: str 一样对其进行注释。我能够在日期时间使用来自docs 的格式代码。
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}]
为了让事情更简单一点,您可以选择从JSONWizard Mixin 类继承子类。这里的主要好处是添加了一堆辅助类方法,例如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)