【问题标题】:Parsing through json data for aws sns event data in python在python中通过json数据解析aws sns事件数据
【发布时间】:2016-06-24 23:51:23
【问题描述】:

我能够使用

将 sns 事件数据分配给变量
def lambda_handler(event, context):
    message = event['Records'][0]['Sns']['Message']
    print("From SNS: " + message)

输出:

{
    "Records": [
        {
            "eventVersion": "2.0",
            "eventSource": "aXXXX",
            "awsRegion": "XXXXX",
            "eventTime": "2016-03-09T12:24:19.255Z",
            "eventName": "ObjectCreated:Put",
            "userIdentity": {
                "principalId": "AWS:XXXXXXXXXXX"
            },
            "requestParameters": {
                "sourceIPAddress": "xxx.xxx.xx.xx"
            },
            "responseElements": {
                "x-amz-request-id": "XXXX",
                "x-amz-id-2": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
            },
            "s3": {
                "s3SchemaVersion": "1.0",
                "configurationId": "xxx-xxx-xxx",
                "bucket": {
                    "name": "bucketname",
                    "ownerIdentity": {
                        "principalId": "XXXXXX"
                    },
                    "arn": "arn:aws:s3:::xxxxx"
                },
                "object": {
                    "key": "index.js",
                    "size": 7068,
                    "eTag": "xxxx",
                    "sequencer": "0000000000"
                }
            }
        }
    ]
}

我无法进一步解析和获取awsRegionRecords.s3.bucket.nameRecords.s3.object.key 的值。

我试过bucketname = message['Records'][0]['s3']['bucket']['name']。 得到错误 TypeError: string indices must be integers

【问题讨论】:

  • 你遇到了什么错误?
  • TypeError: 字符串索引必须是整数
  • 您不需要访问event['Records'][0]['s3']['bucket']['name'],而不是message['Records'][0]['s3']['bucket']['name'] 吗?

标签: python json parsing


【解决方案1】:

我正在尝试在 node.js 中做同样的事情。我错误地认为事件传递的是 JSON 而不是字符串。我补充说:

var message = event.Records[0].Sns.Message;
console.log('Message received from SNS:', message);
var bleh=JSON.parse(event.Records[0].Sns.Message);
var blah = bleh.Records[0].s3.bucket.name;
console.log('Bucket Name:', blah);

终于踢出了正确的桶名。

【讨论】:

    【解决方案2】:

    我认为您可能需要加载 json:

    import json
    
    def lambda_handler(event, context):
        message = event['Records'][0]['Sns']['Message']
        parsed_message = json.loads(message)
        print(parsed_message['Records'][0]['s3']['bucket']['name'])
    

    给我

    u'bucketname'
    

    或者你是在你的功能之外的地方做负载吗?

    【讨论】:

    • 不,我正在函数内部加载,我的问题是如何进一步解析存储在消息中的值
    • 我认为该消息仍然是一个字符串 - 因此您提到字符串索引时出错。我在想你已经解析了外部 json,但是这个消息仍然是一个字符串,需要加载。当我加载您在问题中包含的 json 字符串时,['Records'][0]['s3']['bucket']['name'] 查找对我来说很好。
    • 我的 python 解释器将解析的 json 打印出来也没有那么漂亮,这进一步让我相信,当您在代码中打印出消息时,它仍然是一个字符串。我们可能会运行不同版本的 python,但这可能是造成这种情况的原因?
    • 我正在使用 python 2.7,下面的代码实际上对我有用 def lambda_handler(event, context): message = event['Records'][0]['Sns']['Message'] parsed_message = json.loads(message) bucket = parsed_message['Records'][0]['s3']['bucket']['name'] print ("BUCKET :" + bucket)
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 2017-05-23
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多