在python中加载JSON作为实际对象,而不是dict

时间:2013-10-19 19:54:52

标签: python json

是否可以在python中使用json.loads()来创建实际的Python对象而不是dict值?

我宁愿不必json_data['value_name']而只是json_object.my_value

1 个答案:

答案 0 :(得分:-1)

您可以使用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))