我有一个这样的课程:
class Payload(object):
def __init__(self, payload__):
self.__dict__ = json.loads(payload__)
我可以这样读取JSON负载:
json = Payload('{"Test1":"Test2","Test3":{"Test4":true}}')
所以我可以这样访问Test
的值:
print(json.Test1) # result: Test2
但是我无法访问Test4
的子项Test3
的值
print(json.Test3.Test4) #result: AttributeError: 'dict' object has no attribute 'Test4'
因此,错误为AttributeError: 'dict' object has no attribute 'Test4'
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:0)
我已经解决了!
感谢@Stack链接到Accessing dict keys like an attribute?,该链接有2种不同的方法可以解决我的问题:
json.Test3['Test4']
使用课程:
class AttributeDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value
顺便说一句,我发现第一种方法更容易。
我现在可以像这样访问Test4
的值:
print(json.Test3['Test4'])
答案 1 :(得分:0)
尝试使用:
print(json["Test3"]["Test4"])
答案 2 :(得分:0)
如果您对使用dict表示法(使用方括号)而不是点分表示法不感到困扰,则可以简单地避免使用Payload类,并以这种方式访问dict中的每个数据:
payload = json.loads('{"Test1":"Test2","Test3":{"Test4":true}}')
print(payload['Test1']) # "Test2
print(payload['Test3']['Test4']) # "True
但是,如果要使用点分符号访问每个数据,则可以使用this answer中的AttrDict
类并将其提供给the object_hook
parameter of the json.loads
method。这使得json
模块使用提供的类而不是dict
来将JSON对象映射到Python对象:
import json
class AttrDict(dict):
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self
payload = json.loads(
'{'
' "key_1": "pouet",'
' "key_2": {'
' "key_21": true,'
' "key_22": {'
' "key_221": "toto"'
' }'
' }'
'}',
object_hook=AttrDict)
print(payload.key_1) # "pouet"
print(payload.key_2.key_21) # True
print(payload.key_2.key_22.key_221) # "toto"
请注意,有效载荷类也没用。