【问题标题】:Parsing JSON - TypeError: string indices must be integers解析 JSON - TypeError:字符串索引必须是整数
【发布时间】:2021-08-28 15:07:28
【问题描述】:

我需要检索 GoDaddy 证书名称和到期日期。我正在尝试这样的代码:

def get_cert():
    customerId = "UUID"
    cert_url = "https://api.godaddy.com//v2/customers/%s/certificates" %(customerId)

    cert_response = requests.get(cert_url, headers=headers)
    cert_dict = json.loads(cert_response.text)
    for cert in cert_dict:
        cert_name = (cert['commonName'])
        print(cert_name)

并得到如下错误:

    cert_name = (cert['commonName'])
TypeError: string indices must be integers

未经解析的 API 调用输出:

        {
            "certificateId": "ID", 
            "commonName": "*.domain.co.uk", 
            "completedAt": "2021-01-12T14:26:36Z", 
            "createdAt": "2020-04-02T14:25:06Z", 
            "period": 1, 
            "serialNumber": "NUMBER", 
            "status": "CURRENT", 
            "type": "DV_WILDCARD_SSL", 
            "validEndAt": "2022-05-04T14:26:32Z", 
            "validStartAt": "2021-04-02T14:26:32Z"
        }

我对 GoDaddy 域 API 有相同的代码并且它工作正常(逻辑相同,仅 API URL 和密钥不同)所以我不明白为什么它禁止通过“commonName”和“validEndAt”剪切 json 输出" 在这种情况下。

【问题讨论】:

  • 在这种情况下,使用调试器非常有用;在这种情况下,您需要单步执行失败的循环并查看失败时cert 的值是多少。调试器基本上是第 1 天,编程 101 件要学习的东西,所以如果你还不知道如何使用调试器,这是一个熟悉它的好机会。我建议使用 PyCharm 调试器。
  • 您的行:for cert in cert_dict: 意味着每个 cert 都是一个字符串,因为 json 对象必须具有字符串键。

标签: python arrays json python-2.7 sorting


【解决方案1】:

确保您收到的是您假设的数据类型。如果解码产生包含 dict 对象的 list 实例,则您拥有的代码是合适的。您收到的错误消息似乎是一个dict

当您遍历 dict 时,您将收到它的所有密钥。如果您确切知道所需的密钥,则无需对其进行迭代。

def get_cert():
    customerId = "UUID"
    cert_url = "https://api.godaddy.com//v2/customers/%s/certificates" %(customerId)

    cert_response = requests.get(cert_url, headers=headers)
    cert_dict = json.loads(cert_response.text)
    print(cert_dict['commonName'])

如果密钥不存在,这将引发错误。另一种尝试在没有任何异常的情况下检索它的方法是:

common_name = cert_dict.get('commonName')

如果密钥不存在,common_name 将是 None

【讨论】:

  • 哦,原来如此,没有“commonName”这样的键。打算更深入地探索这个 API。谢谢!
  • 对不起,如果我的解释不清楚,您正在浏览字典中的所有键(意思是字符串实例列表),并且您试图获得 ['commonName'] of @ 987654330@,这会让您遇到该错误。
猜你喜欢
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2019-04-22
  • 2020-06-24
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多