python - 如何将 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的时候都添加属性了?
解决方案
这样你就失去了一些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)
推荐阅读
- tfs - VS Code TFS 显示错误的项目
- python-3.x - Python pandas 数据框正则表达式
- jenkins - Jenkins Pipeline Slack 两步交互
- qt - QML:如何在 TreeView 内的委托中获取 QModelIndex
- react-native - 如何将抽屉导航器嵌套在堆栈中存在的页面中?
- python - 如何通过 Python 启动器打开特定版本的 Python shell?
- ios - Ionic cordova iOS 11 HTML 音频组件损坏
- java - HSQL 数据库用户缺少权限或找不到对象错误尝试将数据插入数据库
- regex - Bash 脚本中的 grep -ioP '(?<=Arguments=\")(.*)(?=":Language=)'
- android-layout - 如何让一个布局占据其他布局未使用的所有空间