使用Python访问JSON子有效负载

时间:2018-09-05 07:50:06

标签: python

我有一个这样的课程:

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'

任何帮助将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:0)

我已经解决了!

感谢@Stack链接到Accessing dict keys like an attribute?,该链接有2种不同的方法可以解决我的问题:

  1. 使用json.Test3['Test4']
  2. 使用课程:

    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"

请注意,有效载荷类也没用。