将一个嵌套字典转换为Python对象

4

我从一个API获得了这个嵌套字典。

response_body = \
{  
    u'access_token':u'SIF_HMACSHA256lxWT0K',
    u'expires_in':86000,
    u'name':u'Gandalf Grey',
    u'preferred_username':u'gandalf',
    u'ref_id':u'ab1d4237-edd7-4edd-934f-3486eac5c262',
    u'refresh_token':u'eyJhbGciOiJIUzI1N',
    u'roles':u'Instructor',
    u'sub':{  
        u'cn':u'Gandalf Grey',
        u'dc':u'7477',
        u'uid':u'gandalf',
        u'uniqueIdentifier':u'ab1d4237-edd7-4edd-934f-3486eac5c262'
    }
}

我使用以下代码将其转换为Python对象:
class sample_token:
    def __init__(self, **response):
        self.__dict__.update(response)

然后像这样使用:

s = sample_token(**response_body)

接下来,我可以使用s.access_tokens.name等方式访问值。但是c.sub的值也是一个字典。如何使用这种技术获得嵌套字典的值呢?比如,s.sub.cn返回Gandalf Grey


你为什么想这样做呢?为什么不直接使用 response_body['sub']['cn'] 呢? - viraptor
@MattDMo 这些数据已经在 Python 字典中了。这个问题实际上与 JSON 没有太多关系,只涉及到嵌套字典。 - viraptor
@viraptor 嗯,我正在尝试一些替代方案。 - Animesh Pandey
@viraptor 你说得对,我当时只是相信了楼主的话。现在已经很晚了... - MattDMo
@MattDMo 我已经修改了。希望现在没问题了。 - Animesh Pandey
@Animesh 没有看到标题,但我已经得到了。谢谢! - MattDMo
3个回答

7
也许可以采用以下递归方法来解决 -
>>> class sample_token:
...     def __init__(self, **response):
...         for k,v in response.items():
...             if isinstance(v,dict):
...                 self.__dict__[k] = sample_token(**v)
...             else:
...                 self.__dict__[k] = v
...
>>> s = sample_token(**response_body)
>>> s.sub
<__main__.sample_token object at 0x02CEA530>
>>> s.sub.cn
'Gandalf Grey'

我们遍历响应中的每个key:value对,如果值是一个字典,我们就为其创建一个sample_token对象,并将该新对象放入__dict__()中。

1
你可以使用 response.items() 迭代所有键/值对,并且对于每个值,如果 isinstance(value, dict),则用 sample_token(**value) 替换它。
没有任何东西会自动递归。

0

在Python中评估表达式后,它不再是JSON对象;它是一个Python dict。访问条目的常规方式是使用[]索引器符号,例如:

response_body['sub']['uid']
'gandalf'

如果你必须将其作为对象而不是字典进行访问,请查看问题将Python字典转换为对象?中的答案;嵌套字典的情况在其中一个较晚的答案中有所涉及。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接