解析JSON时出现“字符串索引必须是整数”错误

2024-09-29 21:35:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的JSON,我想提取其中的所有电子邮件。json是从AWS cognito导出的,我无法控制它的结构

expected_value = """{
  "Users": [
    {
      "Username": "testUserName1",
      "Attributes": [
        {
          "Name": "testName1",
          "Value": "TestValue1@email.com"
        }
      ],
      "UserCreateDate": "2021-09-13T11:16:02.627000+01:00",
      "UserLastModifiedDate": "2021-09-13T11:16:02.627000+01:00",
      "Enabled": true,
      "UserStatus": "UNCONFIRMED"
    },
    {
      "Username": "testUsername2",
      "Attributes": [
        {
          "Name": "testEmail2",
          "Value": "testValue2@email.com"
        }
      ],
      "UserCreateDate": "2021-02-19T11:52:52.465000+00:00",
      "UserLastModifiedDate": "2021-02-19T11:52:52.465000+00:00",
      "Enabled": true,
      "UserStatus": "UNCONFIRMED"
    }
  ]
}"""

我有以下代码,目前我正在按预期值输入json:

def lambda_handler(event, context):
    data = json.dumps(expected_value)
    y = json.loads(data)
    email = y['Users'][0]['Attributes'][0]['Value']

但我得到了以下错误:

{
  "errorMessage": "string indices must be integers",
  "errorType": "TypeError",
  "requestId": "622258cc-8248-4901-8a39-fc6e0a24229c",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 145, in lambda_handler\n    email = y['Users'][0]['Attributes'][0]['Value']\n"
  ]
}

我不知道我做错了什么

根据请求,仍然抛出错误的REPREX:


Tags: lambdanamecomjsontruevalueemailusername
3条回答
user_list = []
for item in json:
    users_list.append(item['Users'][0]['Attributes'][0]['Value'])

因为这里的“属性”是一个字典列表

以下内容适合我。注意:我删除了您当前问题中的数据转储和重新加载

import json


def lambda_handler(event, context):
    data = json.loads(event)
    email = data['Users'][0]['Attributes'][0]['Value']
    print(f'{email=}')  # -> email='TestValue1@email.com'


event = '''
{
  "Users": [
    {
      "Username": "testUserName1",
      "Attributes": [
        {
          "Name": "testName1",
          "Value": "TestValue1@email.com"
        }
      ],
      "UserCreateDate": "2021-09-13T11:16:02.627000+01:00",
      "UserLastModifiedDate": "2021-09-13T11:16:02.627000+01:00",
      "Enabled": true,
      "UserStatus": "UNCONFIRMED"
    },
    {
      "Username": "testUsername2",
      "Attributes": [
        {
          "Name": "testEmail2",
          "Value": "testValue2@email.com"
        }
      ],
      "UserCreateDate": "2021-02-19T11:52:52.465000+00:00",
      "UserLastModifiedDate": "2021-02-19T11:52:52.465000+00:00",
      "Enabled": true,
      "UserStatus": "UNCONFIRMED"
    }
  ]
}
'''

lambda_handler(event, None)

would like to extract all the email's within it

lambda事件应该已经是JSON,IIRC

正如错误所说,您需要使用数字对列表进行索引,或者在整个列表上使用for-each循环

emails = []
for user in event.get('Users', []):  # assuming event is already a dict
    for a in user.get('Attributes', []):
        # probably also want to get the Name field and check the property is actually an email 
        v = a.get('Value')
        if v:
            emails.append(v)
print(emails)

相关问题 更多 >

    热门问题