【问题标题】:Python Convert JSON Array to Corresponding List of Python ObjectsPython 将 JSON 数组转换为对应的 Python 对象列表
【发布时间】:2022-01-05 10:14:33
【问题描述】:

找不到说明如何执行此操作的现有帖子: 我有一个 JSON 数组,比如

[{'completed': 0, 'content': 'do smtng', 'deadline': 'Mon, 22 Nov 2021 00:00:00 GMT', 'id': 4, 'user_id': 7} , ...],

并且希望将其转换为任务对象的 Python 列表(来自我创建的任务类)。

我该怎么做呢?

【问题讨论】:

  • 你能举个例子吗?你的Task 班级是什么样子的?

标签: python arrays json


【解决方案1】:

您要做的是将一个 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))

如果你愿意,你也可以在这里执行输入验证,但尽量保持基本

【讨论】:

    【解决方案2】:

    如果您可以使用外部库,最简单的解决方案是使用 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)
    

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 2012-07-03
      • 2018-10-11
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多