首页 > 解决方案 > 将 JSON 列表读入 Python 类的 Pythonic 方法

问题描述

考虑以下代码

import json


class Address(object):
    def __init__(self, street, number):
        self.street = street
        self.number = number

    def __str__(self):
        return "{0} {1}".format(self.street, self.number)


class User(object):
    address: List[Address] = []

    def __init__(self, name, address: List):
        self.name = name
        for adr in address:
            self.address.append(Address(*adr)) # is this needed?

    def __str__(self):
        return "{0} ,{1}".format(self.name, self.address)


if __name__ == '__main__':
    js = '''{
    "name": "Cristian",
    "address": [{
            "street": "Sesame",
            "number": 122
        },
        {
            "street": "Sesame",
            "number": 122
        }
    ]
}'''
    j = json.loads(js)
    print(j)
    u = User(**j)
    print(u.name)
    print(u.address[0].number) 

我的问题是,对于这种类型的 JSON,我们有一个值列表。我们需要遍历列表吗?或者有没有更pythonic的方式来简单地填充这个对象

address: List[Address] = []

从加载的json?

标签: python

解决方案


你可以更喜欢python 中的dataclassesjson dataclasses

from typing import List
import json

from dataclasses import dataclass, field
from dataclasses_json import dataclass_json


class Address(object):
    def __init__(self, street, number):
        self.street = street
        self.number = number

    def __str__(self):
        return "{0} {1}".format(self.street, self.number)


@dataclass_json
@dataclass
class User(object):
    address: List[Address] = field(default_factory=lambda: [])
    name: str = None

    def __str__(self):
        return "{0} ,{1}".format(self.name, self.address)


if __name__ == '__main__':
    js = '''{
    "name": "Cristian",
    "address": [{
            "street": "Sesame",
            "number": 122
        },
        {
            "street": "Sesame",
            "number": 122
        }
    ]
    }'''

    data = User.from_dict(json.loads(js))
    print(data)

如果你使用__str__User会打印

Cristian ,[{'street': 'Sesame', 'number': 122}, {'street': 'Sesame', 'number': 122}]

否则,如果您省略__str__其中User将打印

User(address=[{'street': 'Sesame', 'number': 122}, {'street': 'Sesame', 'number': 122}], name='Cristian')

Address类可以避免


推荐阅读