将嵌套的dict转换为Python对象

时间:2015-07-27 01:46:08

标签: python json dictionary

我有一个从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

3 个答案:

答案 0 :(得分:5)

也许像这样的递归方法 -

>>> 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对,如果value是字典,我们为其创建一个sample_token对象,并将该新对象放入__dict__()

答案 1 :(得分:1)

您可以使用response.items()迭代所有键/​​值对,并为isinstance(value, dict)的每个值进行迭代,将其替换为sample_token(**value)

没有什么能自动为你做递归。

答案 2 :(得分:0)

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

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

如果必须将其作为对象而非dict进行访问,请查看问题Convert Python dict to object?中的答案;嵌套dicsts的情况将在后面的一个答案中介绍。