是否可以json.loads()
在 python 中使用来创建实际的 Python 对象而不是 dict 值?
我宁愿不必做json_data['value_name']
,只做json_object.my_value
。
您可以使用 Python 替代语法来创建类型:
attributes = {
'a': 12,
'b': 'there-is-a-value-here',
'greet': (lambda self: print("Hi, my a is {}".format(self.a)))
}
SomeCoolType = type("SomeCoolType", (), attributes)
someCoolInstance = SomeCoolType()
someCoolInstance.greet() # this prints "Hi, my a is 12"
第一个参数是类型名称,第二个是带有父类的元组,第三个是属性字典。因此,考虑到这一点,您可以首先将 JSON 解码为 dict,然后从中构造一个类型,然后实例化它:
d = json.loads(json_data)
T = type("JSON", (), d)
json_object = T()
或者,更短:
json_object = type("JSON", (), json.loads(json_data))()
这种简单的方法只会将顶级字典更改为对象;如果您希望能够调用json_object.param.something.value
,则必须通过递归进行转换(类似于浅拷贝与深拷贝):
def to_object(dictionary):
for key, value in dictionary.items():
if isinstance(value, dict): dictionary[key] = value
return type("JSON", (), dictionary)
json_object = to_object(json.loads(json_data))