【问题标题】:Error when trying to access data via API using Python尝试使用 Python 通过 API 访问数据时出错
【发布时间】:2020-02-24 18:51:53
【问题描述】:

尝试使用 API 访问有关服务器存储的详细信息时出现错误。我想提取 json 中 state 的备份状态:

{
   "storage": {
      "access": "private",
      "backup_rule": {},
      "backups": {
         "backup": []
      },
      "license": 0,
      "part_of_plan": "",
      "servers": {
         "server": [
            ""
         ]
      },
      "size": ,
      "state": "online",
      "tier": "",
      "title": "",
      "type": "",
      "uuid": "",
      "zone": ""
   }
}

当我执行这段代码时:

bkpdet = requests.get('https://fffff.com/1.2/storage/08475', auth=HTTPBasicAuth('login', 'pass'))
bkpdet_json = bkpdet.json()
datastg = bkpdet.json()
print(datastg)
for sts in datastg['storage']:
    bkpsts = sts['state']
    print(bkpsts)

我收到此错误:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: string indices must be integers

如何访问 state*? 整个想法是最后使用此代码获取有关状态的信息:

if bkpsts == "online":
    print('Backup has been created.')
else bkpsts == "backuping":
    print('Backup creation is in progress.')
else:
    print(bkpdet.status_code)

我正在搜索,但仍然找不到这里有什么问题。

【问题讨论】:

    标签: python json rest api


    【解决方案1】:

    使用时:

    for sts in datastg['storage']:
    

    sts 将是一个字符串键。您正试图将其视为字典。

    如果只需要state值,可以直接访问:

    datastg['storage']['state']
    

    如果要迭代storage下的所有键值对,可以使用items()对键和值。

    for key, value in datastg['storage'].items():
        print(key,":", value)
    

    【讨论】:

      【解决方案2】:

      下面的代码有效

      data = {
          "storage": {
              "access": "private",
              "backup_rule": {},
              "backups": {
                  "backup": []
              },
              "license": 0,
              "part_of_plan": "",
              "servers": {
                  "server": [
                      ""
                  ]
              },
              "size": 1,
              "state": "online",
              "tier": "",
              "title": "",
              "type": "",
              "uuid": "",
              "zone": ""
          }
      }
      
      state = data['storage']['state']
      print(state)
      

      输出

      online
      

      【讨论】:

      • 这对我不起作用,我收到一个错误:&gt;&gt;&gt; state = data['storage']['state'] Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; KeyError: 'storage' &gt;&gt;&gt; print(state) Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; NameError: name 'state' is not defined
      【解决方案3】:

      正如@MarkMeyer 建议的那样,我更改了这样的代码:

      bkpdet = requests.get('https://fffff.com/1.2/storage/08475', auth=HTTPBasicAuth('login', 'pass'))
      bkpdet_json = bkpdet.json()
      datastg = bkpdet.json()
      bkpsts = datastg['storage']['state']
      print(bkpsts)
      

      效果很好!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-07
        • 2020-08-09
        • 1970-01-01
        • 2021-05-29
        相关资源
        最近更新 更多