【问题标题】:"string indices must be integers" error when parsing JSON解析 JSON 时出现“字符串索引必须是整数”错误
【发布时间】:2021-11-10 14:47:24
【问题描述】:

我有以下 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:

【问题讨论】:

  • item['Users']['Attributes'] 需要 item['Users']['Attributes'][0]['Value'] 之前的其他索引,因为 Attributes 是对象列表
  • @depperm 你还需要[0]["Users"] 之后。
  • 一切都应该在您的问题中。您问题中的代码没有意义。它引用了未定义的变量,例如expected_value,而process_event() 函数不返回任何值。
  • 另外,不要为了再次加载而转储字符串

标签: python json python-3.x


【解决方案1】:

查看已显示的代码,expected_value 变量的值已经是 JSON 格式的字符串。当json.dumps() 应用到它时,该值被“嵌入”到另一个(冗余)JSON“层”中。

所以要么从你的expected_value 中删除""" 三重引号,要么从你的函数中删除json.dumps();在后一种情况下,expected_value 应该直接传递给json.loads()

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

【讨论】:

    【解决方案2】:

    以下内容对我有用。请注意,我删除了您当前在问题中拥有的数据的转储和重新加载。

    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)
    
    

    【讨论】:

      【解决方案3】:

      想要提取其中的所有电子邮件

      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)
      

      【讨论】:

      • 感谢您的回复。我的目标是通过云观察事件触发这个 lambda。本质上,我想做的是从 AWS cognito 获取一个包含所有未确认用户的 json。我目前希望这是 lambda 中的一个函数,并将其存储为“expected_value”。
      • 这段代码可以放在定义了event变量的任何地方。
      【解决方案4】:
      user_list = []
      for item in json:
          users_list.append(item['Users'][0]['Attributes'][0]['Value'])
      

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

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 2016-04-22
        • 2021-08-01
        • 1970-01-01
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        相关资源
        最近更新 更多