首页 > 解决方案 > 如何将 json 文件转换为 python 类?

问题描述

考虑这个名为h.json我想将其转换为 python 数据类的 json 文件。

{
    "acc1":{
        "email":"acc1@example.com",
        "password":"acc1",
        "name":"ACC1",
        "salary":1
    },
    "acc2":{
        "email":"acc2@example.com",
        "password":"acc2",
        "name":"ACC2",
        "salary":2
    }

}

我可以使用替代构造函数来获取每个帐户,例如:

import json
from dataclasses import dataclass

@dataclass
class Account(object):
    email:str
    password:str
    name:str
    salary:int
    
    @classmethod
    def from_json(cls, json_key):
        file = json.load(open("h.json"))
        return cls(**file[json_key])

但这仅限于在数据类中定义的参数(电子邮件、姓名等)。

如果我要修改 json 以包含另一件事,比如年龄,该怎么办?该脚本最终会返回一个TypeError,特别是TypeError: __init__() got an unexpected keyword argument 'age'.

有没有办法根据dict(json对象)的key动态调整类属性,这样就不用每次给json添加新key的时候都添加属性了?

标签: pythonjsonooppython-dataclassespython-class

解决方案


这样你就失去了一些dataclass功能。

  • 比如判断是optional不是
  • 比如自动完成功能

但是,您更熟悉您的项目并做出相应决定

一定有很多方法,但这是其中之一:

@dataclass
class Account(object):
    email: str
    password: str
    name: str
    salary: int

    @classmethod
    def from_json(cls, json_key):
        file = json.load(open("1.txt"))
        keys = [f.name for f in fields(cls)]
        # or: keys = cls.__dataclass_fields__.keys()
        json_data = file[json_key]
        normal_json_data = {key: json_data[key] for key in json_data if key in keys}
        anormal_json_data = {key: json_data[key] for key in json_data if key not in keys}
        tmp = cls(**normal_json_data)
        for anormal_key in anormal_json_data:
            setattr(tmp,anormal_key,anormal_json_data[anormal_key])
        return tmp

test = Account.from_json("acc1")
print(test.age)

推荐阅读