问题解析JSON filePython

2024-05-19 19:18:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在一个大的JSON文件中有这个部分

"UserDetailList": [
        {
            "UserName": "citrix-xendesktop-ec2-provisioning", 
            "GroupList": [], 
            "CreateDate": "2017-11-07T14:20:14Z", 
            "UserId": "AIDAI2YJINPRUEM3XHKXO", 
            "Path": "/", 
            "AttachedManagedPolicies": [
                {
                    "PolicyName": "AmazonEC2FullAccess", 
                    "PolicyArn": "arn:aws:iam::aws:policy/AmazonEC2FullAccess"
                }, 
                {
                    "PolicyName": "AmazonS3FullAccess", 
                    "PolicyArn": "arn:aws:iam::aws:policy/AmazonS3FullAccess"
                }
            ], 
            "Arn": "arn:aws:iam::279052847476:user/citrix-xendesktop-ec2-provisioning"
        }, 

需要提取用户的AttachedManagedPolicy.Policy名称

期望输出:

"citrix-xendesktop-ec2-provisioning","AmazonEC2FullAccess"
"citrix-xendesktop-ec2-provisioning","AmazonS3FullAccess"

有些用户根本没有任何策略,因此需要一些检查机制来避免错误

with open('1.json') as file:
        data = json.load(file)
        for element in data['UserDetailList']:
            s = element['UserName'], element['AttachedManagedPolicies']
            print s

以及获得

(u'citrix-xendesktop-ec2-provisioning', [{u'PolicyName': u'AmazonEC2FullAccess', u'PolicyArn': u'arn:aws:iam::aws:policy/AmazonEC2FullAccess'}, {u'PolicyName': u'AmazonS3FullAccess', u'PolicyArn': u'arn:aws:iam::aws:policy/AmazonS3FullAccess'}])

添加时element['AttachedManagedPolicies']['PolicyName']

得到:TypeError: list indices must be integers, not str


Tags: awspolicyelementec2iamarnprovisioningcitrix
1条回答
网友
1楼 · 发布于 2024-05-19 19:18:33

出现错误是因为element['AttachedManagedPolicies']不是字典,您需要遍历element['AttachedManagedPolicies'],然后按如下所示访问键:

[i['PolicyName'] for i in element['AttachedManagedPolicies']]

这将构造键PolicyName的值列表

正如您所说的,您有非常大的JSON结构,您可能有空值,也可能没有空值,为此,您可以按以下步骤进行:

d = {
"UserDetailList": [
        {
            "UserName": "citrix-xendesktop-ec2-provisioning", 
            "GroupList": [], 
            "CreateDate": "2017-11-07T14:20:14Z", 
            "UserId": "AIDAI2YJINPRUEM3XHKXO", 
            "Path": "/", 
            "AttachedManagedPolicies": [
                {
                    "PolicyName": "AmazonEC2FullAccess", 
                    "PolicyArn": "arn:aws:iam::aws:policy/AmazonEC2FullAccess"
                }, 
                {
                    "PolicyName": "AmazonS3FullAccess", 
                    "PolicyArn": "arn:aws:iam::aws:policy/AmazonS3FullAccess"
                }
            ], 
            "Arn": "arn:aws:iam::279052847476:user/citrix-xendesktop-ec2-provisioning"
        } 
    ]
}

user_list = d.get("UserDetailList", None)  # if unable to fetch key then it will return None
if user_list:
    for user_detail in user_list:
        username = user_detail.get("UserName", None)
        policies = [i.get('PolicyName') for i in user_detail.get('AttachedManagedPolicies', []) if i.get('PolicyName', None)]  # empty list constructed if no policy exist
        print(username, policies)

相关问题 更多 >