2016-08-30 139 views
-5

我有一本名为json_dict的字典给出如下。我需要访问元素==> json_dict['OptionSettings'][3]['Value']访问字典时出现KeyError错误?

我需要使用语法

print(json_dict[parameter])访问的元素。

当我给一个参数,比如

param="['OptionSettings'][3]['Value']"

param="'OptionSettings'][3]['Value']"

我得到一个错误类似下面:

KeyError: "['OptionSettings'][3]['Value']"

我尝试使用下面的解决方案,但它只是打印字符串

str1="json_dict" 
print(str1+param) 

完全解释如下:

{ 
     "ApplicationName": "Test", 
     "EnvironmentName": "ABC-Nodejs", 
     "CNAMEPrefix": "ABC-Neptune", 
     "SolutionStackName": "64bit Amazon Linux 2016.03 v2.1.1 running Node.js", 
     "OptionSettings": [ 
          { 
          "Namespace": "aws:ec2:vpc", 
          "OptionName": "AssociatePublicIpAddress", 
          "Value": "true" 
          }, 
          { 
          "Namespace": "aws:elasticbeanstalk:environment", 
          "OptionName": "EnvironmentType", 
          "Value": "LoadBalanced" 
          }, 
          { 
          "Namespace": "aws:ec2:vpc", 
          "OptionName": "Subnets", 
          "Value": "param1" 
          }, 
          { 
          "Namespace": "aws:autoscaling:launchconfiguration", 
          "OptionName": "SecurityGroups", 
          "Value": "param2" 
          }, 
          { 
          "Namespace": "aws:autoscaling:asg", 
          "OptionName": "MinSize", 
          "Value": "1" 
          }, 
          { 
          "Namespace": "aws:autoscaling:asg", 
          "OptionName": "MaxSize", 
          "Value": "4" 
          }, 
          { 
          "Namespace": "aws:autoscaling:asg", 
          "OptionName": "Availability Zones", 
          "Value": "Any" 
          }, 
          { 
          "Namespace": "aws:autoscaling:asg", 
          "OptionName": "Cooldown", 
          "Value": "360" 
          }, 
          { 
          "Namespace": "aws:autoscaling:launchconfiguration", 
          "OptionName": "IamInstanceProfile", 
          "Value": "NepRole" 
          }, 
          { 
          "Namespace": "aws:autoscaling:launchconfiguration", 
          "OptionName": "MonitoringInterval", 
          "Value": "5 minutes" 
          }, 
          { 
          "Namespace": "aws:autoscaling:launchconfiguration", 
          "OptionName": "RootVolumeType", 
          "Value": "gp2" 
          }, 
          { 
          "Namespace": "aws:autoscaling:launchconfiguration", 
          "OptionName": "RootVolumeSize", 
          "Value": "10" 
          }, 
          { 
          "Namespace": "aws:elasticbeanstalk:sns:topics", 
          "OptionName": "Notification Endpoint", 
          "Value": "[email protected]" 
          }, 
          { 
          "Namespace": "aws:elasticbeanstalk:hostmanager", 
          "OptionName": "LogPublicationControl", 
          "Value": "false" 
          }, 
          { 
          "Namespace": "aws:elasticbeanstalk:command", 
          "OptionName": "DeploymentPolicy", 
          "Value": "Rolling" 
          }, 
          { 
          "Namespace": "aws:elasticbeanstalk:command", 
          "OptionName": "BatchSizeType", 
          "Value": "Percentage" 
          }, 
          { 
          "Namespace": "aws:elasticbeanstalk:command", 
          "OptionName": "BatchSize", 
          "Value": "100" 
          }, 
          { 
          "Namespace": "aws:elasticbeanstalk:command", 
          "OptionName": "HealthCheckSuccessThreshold", 
          "Value": "Ok" 
          }, 
          { 
          "Namespace": "aws:elasticbeanstalk:command", 
          "OptionName": "IgnoreHealthCheck", 
          "Value": "false" 
          }, 
          { 
          "Namespace": "aws:elasticbeanstalk:command", 
          "OptionName": "Timeout", 
          "Value": "600" 
          }, 
          { 
          "Namespace": "aws:autoscaling:updatepolicy:rollingupdate", 
          "OptionName": "RollingUpdateEnabled", 
          "Value": "false" 
          }, 
          { 
          "Namespace": "aws:ec2:vpc", 
          "OptionName": "ELBSubnets", 
          "Value": "param3" 
          }, 
          { 
          "Namespace": "aws:elb:loadbalancer", 
          "OptionName": "SecurityGroups", 
          "Value": "param4" 
          }, 
          { 
          "Namespace": "aws:elb:loadbalancer", 
          "OptionName": "ManagedSecurityGroup", 
          "Value": "param4" 
          } 
          ] 

} 

回答

2

可惜你不能做到这一点。

当您键入param="['OptionSettings'][3]['Value']",然后json_dict[param]时,您基本上要求键值"['OptionSettings'][3]['Value']"所表示的值不存在。

你必须浏览层面,直到你到达最后一层。


当然不过,如果你需要一个的一行,你总是可以创造出一些逻辑,并提取到的方法。

例如,而不是

print(json_dict[param]). 

你可以使用类似

print(get_json_value(json_dict, param)) 

,并定义如

import re 

def get_json_value(json_dict, params): 
    list_of_params = re.findall(r'\[([^]]*)\]', params) 
    #list_of_params = ['OptionSettings', '3', 'Value'] 

    _ = json_dict 
    for elem in list_of_params: 
     _ = _[elem] 
    return _ 

我没有测试的功能,但它应该工作正常。
(另外,它只是提出来指导您完成一个替代的解决方案演示)

-1

这为我工作

str1="json_dict" 
params="['OptionSettings'][3]['Value']" 
str2=str1+params 
print(eval(str5)) 

这里使用功能的eval()是关键解决此问题。