Search code examples
pythondictionaryaws-secrets-manager

Fail to acces dict in dict with string indeces must be integer error


import boto3
client = boto3.client('secretsmanager')

response = client.get_secret_value(SecretId='xxxx')
print('entire response:', response)
print('SecretString:',response['SecretString'])
print('testvalue:'response['SecretString']["testkey"])    

I am trying to implement aws secretsmanager and need to acces the testvalue.

entire response:{---, u'SecretString': u'{"testkey":"testvalue","testkey2":"testvalue2"}', ----}
Secretstring:{"testkey":"testvalue","testkey2":"testvalue2"}
Traceback (most recent call last):
  File "secretmanagertest.py", line 7, in <module>
    print('testvalue',response['SecretString']["testkey"])
TypeError: string indices must be integers

When I try integer instead I only get the specific character.

print(response['SecretString'][0])
{
print(response['SecretString'][1])
"
print(response['SecretString'][2])
t

etc.


Solution

  • The response is a nested JSON document, not a dictionary yet. Decode it first, with json.loads():

    import json
    
    secret = json.loads(response['SecretString'])
    print(secret['testkey'])
    

    Demo:

    >>> import json
    >>> response = {u'SecretString': u'{"testkey":"testvalue","testkey2":"testvalue2"}'}
    >>> response['SecretString']
    u'{"testkey":"testvalue","testkey2":"testvalue2"}'
    >>> json.loads(response['SecretString'])
    {u'testkey2': u'testvalue2', u'testkey': u'testvalue'}
    >>> json.loads(response['SecretString'])['testkey']
    u'testvalue'