3

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

我宁愿不必做json_data['value_name'],只做json_object.my_value

4

1 回答 1

-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))
于 2013-10-19T20:37:09.323 回答