Convert Python Object(From JSON) To Class Object
根据官方文档:https://www.runoob.com/python/python-json.html,Python操作JSON主要是以下两个函数:
json.dumps 将 Python 对象编码成 JSON 字符串
json.loads 将已编码的 JSON 字符串解码为 Python 对象
问题
假设我们有settings.json的文本文件,内容如下:
{
"post": {
"enable": 1,
"url": "http://localhost:3000/events/179/1"
},
"stranger": {
"skip_frames": 0
},
"object": {
"skip_frames": 0
}
}
我们可以通过如下方式,将已编码的 JSON 字符串解码为 Python 对象:
# _*_ coding:utf-8 _*_
import os
import json
import time
# 当前文件的路径
basePath = os.path.dirname(__file__)
settings = {}
with open(os.path.join(basePath, 'settings.json'), 'rt') as f:
settings_json_str = f.read()
obj = json.loads(settings_json_str)
f.close()
# 调用方式
print(obj["object"]["skip_frames"])
解决
代码如下:
# _*_ coding:utf-8 _*_
import os
import json
import time
# 当前文件的路径
basePath = os.path.dirname(__file__)
settings = {}
# python object 转换为 class 对象,主要为了调用方便
def obj2class(obj):
try:
if isinstance(obj, list):
a = []
for v in obj:
b = obj2class(v)
a.append(b)
return a
elif isinstance(obj, dict):
class_name = "class_{0}".format(uuid.uuid1())
MyClass = type(class_name, (object,), {})
a = MyClass()
for x in obj.items():
key = x[0]
value = x[1]
setattr(a, key, obj2class(value))
return a
else:
return obj
except Exception:
pass
return obj
with open(os.path.join(basePath, 'settings.json'), 'rt') as f:
settings_json_str = f.read()
obj = json.loads(settings_json_str)
settings = obj2class(obj)
f.close()
# 调用方式
print(obj.object.skip_frames)
总结
因为通过obj[‘key’]的方式也可以用,其实并没有解决太多问题,只是多了一种选择,适应个人的书写习惯。