KeyError al acceder al diccionario?

Tengo un diccionario llamado json_dict dado a continuación.

Necesito acceder al elemento ==> json_dict['OptionSettings'][3]['Value'] .

Necesito acceder al elemento utilizando la syntax.

print(json_dict[parameter]) .

Cuando le doy un parámetro como

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

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

Me aparece un error como el que se muestra a continuación:

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

Intenté usar la siguiente solución pero solo imprimí una cadena

 str1="json_dict" print(str1+param) 

Diccionario completo a continuación:

 { "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": "sunil.kumar2@pb.com" }, { "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" } ] } 

Desafortunadamente no puedes hacer eso.

Cuando escribe param="['OptionSettings'][3]['Value']" y luego json_dict[param] , básicamente está pidiendo el valor representado por la tecla "['OptionSettings'][3]['Value']" que no existe.

Tendrás que navegar por los niveles hasta llegar al último.


Pero, por supuesto, si necesita una sola línea , siempre puede crear algo de lógica y extraerla a un método.

Por ejemplo, en lugar de

 print(json_dict[param]). 

podrías usar algo como

 print(get_json_value(json_dict, param)) 

y definir una función como

 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 _ 

No lo he probado, pero debería funcionar bien.
(Además, es solo una demostración hecha para guiarlo a través de una solución alternativa)

Esto funciono para mi

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

Aquí el uso de la función eval () es la clave para resolver esto.