Получение сериализуемой ошибки JSON для даты и времени - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь получить подробности стека CloudFormation, используя boto3, как показано ниже

import boto3
import json

def lambda_handler(event, context):
    global cnfOutput
    cnfOutput = cfn1.describe_stacks(StackName='cfn-init-stack1')
    cnf2 = json.dumps(cnfOutput)
    return cnf2

Ниже приведен вывод, который я получу, если напечатаю cfnOutput.Я пытался сделать json.dumps и получить ошибку.Нужна помощь

{u'Stacks': [{u'StackId': 'arn:aws:cloudformation:us-west-2:123456789123:stack/cfn-init-stack1/d209-11e8-b83e-0ad6ed005066', u'Description': 'CloudFormation template for creating an ec2 instance', u'Parameters': [{u'ParameterValue': 'e1', u'ParameterKey': 'KeyName'}, {u'ParameterValue': 'ami-a0cfeed8', u'ParameterKey': 'ImageId'}, {u'ParameterValue': 't2.micro', u'ParameterKey': 'InstanceType'}], u'Tags': [], u'Outputs': [{u'Description': 'The public name of the EC2 instance.', u'OutputKey': 'PublicName', u'OutputValue': 'ec2-51-111-211-211.us-west-2.compute.amazonaws.com'}], u'RoleARN': 'arn:aws:iam::123456789123:role/CFN1-role', u'EnableTerminationProtection': False, u'CreationTime': datetime.datetime(2018, 10, 17, 12, 40, 10, 783000, tzinfo=tzlocal()), u'StackName': 'cfn-init-stack1', u'NotificationARNs': ['arn:aws:sns:us-west-2:123456789123:topic2'], u'StackStatus': 'CREATE_COMPLETE', u'DisableRollback': False, u'RollbackConfiguration': {u'RollbackTriggers': []}}], 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': 'd20e-11e8-b15b-a11f0bf7ba', 'HTTPHeaders': {'x-amzn-requestid': 'd20e-11e8-b15b-a11f0bf7ba', 'date': 'Wed, 17 Oct 2018 13:13:11 GMT', 'content-length': '2010', 'content-type': 'text/xml'}}}

Ошибка ниже:

Файл "/usr/lib64/python2.7/json/encoder.py", строка 184, по умолчанию повышение TypeError (repr (o) + "не является сериализуемым JSON") TypeError: datetime.datetime (2018, 10, 17, 12, 40, 10, 783000, tzinfo = tzlocal ()) не является сериализуемым JSON

1 Ответ

0 голосов
/ 17 октября 2018

Как преобразовать исходный словарь в JSON

Для меня без проблем получилось следующее:

j = json.dumps({"key": str(datetime.datetime(2017, 10, 12, 12, 40, 10, 783000))})

Однако, когда я запустил его как:

j = json.dumps({"key": datetime.datetime(2017, 10, 12, 12, 40, 10, 783000)})

Я получил ту же ошибку, что и вы.

Если вы можете преобразовать результат datetime.datetime(2018, 10, 17, 12, 40, 10, 783000, tzinfo=tzlocal()) в строку перед вызовом json.dumps, это должно исправить вашу проблему.

Как извлечь OutputValue из исходного словаря

# d is your original dictionary
# after you convert the datetime.datetime() result to string
d = {
    u'Stacks': [{
        u'StackId': 'arn:aws:cloudformation:us-west-2:123456789123:stack/cfn-init-stack1/d209-11e8-b83e-0ad6ed005066', 
        u'Description': 'CloudFormation template for creating an ec2 instance', u'Parameters': [{
            u'ParameterValue': 'e1', u'ParameterKey': 'KeyName'
        }, {
            u'ParameterValue': 'ami-a0cfeed8', u'ParameterKey': 'ImageId'
        }, {
            u'ParameterValue': 't2.micro', u'ParameterKey': 'InstanceType'
        }], u'Tags': [], u'Outputs': [{
            u'Description': 'The public name of the EC2 instance.', u'OutputKey': 'PublicName', u'OutputValue': 'ec2-51-111-211-211.us-west-2.compute.amazonaws.com'
        }], u'RoleARN': 'arn:aws:iam::123456789123:role/CFN1-role', u'EnableTerminationProtection': False, u'CreationTime': str(datetime.datetime(2018, 10, 17, 12, 40, 10, 783000)), u'StackName': 'cfn-init-stack1', u'NotificationARNs': ['arn:aws:sns:us-west-2:123456789123:topic2'], u'StackStatus': 'CREATE_COMPLETE', u'DisableRollback': False, u'RollbackConfiguration': {
            u'RollbackTriggers': []
        }
    }], 
    'ResponseMetadata': {
        'RetryAttempts': 0,
        'HTTPStatusCode': 200,
        'RequestId': 'd20e-11e8-b15b-a11f0bf7ba',
        'HTTPHeaders': {
            'x-amzn-requestid': 'd20e-11e8-b15b-a11f0bf7ba',
            'date': 'Wed, 17 Oct 2018 13:13:11 GMT',
            'content-length': '2010',
            'content-type': 'text/xml'
        }
    }
}

stacks = d.get("Stacks")

if stacks == None:
    print("Key not in dictionary")
else:
    for s in stacks:
        outputs = s.get("Outputs")
        if outputs == None:
            continue

        for o in outputs:
            print(o.get("OutputValue"))

Для меня выводится ec2-51-111-211-211.us-west-2.compute.amazonaws.com при использовании словаря в вашем вопросе (после преобразования datetime.datetime() result в строку, но до преобразования всего словаря в JSON).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...