python TypeError:字符串索引必须为整数json

时间:2018-07-16 11:07:06

标签: python json

有人可以告诉我我在做什么错吗?我正在收到此错误。 经历了类似错误的早期帖子。无法理解。.

import json
import re
import requests
import subprocess
res = requests.get('https://api.tempura1.com/api/1.0/recipes', auth=('12345','123'), headers={'App-Key': 'some key'})
data = res.text
extracted_recipes = []
for recipe in data['recipes']:
  extracted_recipes.append({
            'name': recipe['name'],
            'status': recipe['status']
        })
  print extracted_recipes

TypeError:字符串索引必须为整数

数据包含以下内容

{
    "recipes": {
        "47635": {
            "name": "Desitnation Search",
            "status": "SUCCESSFUL",
            "kitchen": "eu",
            "active": "YES",
            "created_at": 1501672231,
            "interval": 5,
            "use_legacy_notifications": false
        },
        "65568": {
            "name": "Validation",
            "status": "SUCCESSFUL",
            "kitchen": "us-west",
            "active": "YES",
            "created_at": 1522583593,
            "interval": 5,
            "use_legacy_notifications": false
        },
        "47437": {
            "name": "Gateday",
            "status": "SUCCESSFUL",
            "kitchen": "us-west",
            "active": "YES",
            "created_at": 1501411588,
            "interval": 10,
            "use_legacy_notifications": false
        }
    },
    "counts": {
        "total": 3,
        "limited": 3,
        "filtered": 3
    }
}

2 个答案:

答案 0 :(得分:1)

您没有将文本转换为json。试试

data = json.loads(res.text)

data = res.json()

除此之外,您可能需要更改for循环以遍历值而不是键。将其更改为以下内容

for recipe in data['recipes'].values()

答案 1 :(得分:0)

您的代码有两个问题,您可以通过进行最少的调试来自己发现。

第一个问题是您没有将响应内容从json解析到本地Python对象。在这里:

data = res.text

data是一个字符串(json格式,但仍然是一个字符串)。您需要对其进行解析以将其转换为python表示形式(在这种情况下为dict)。您可以使用stdlib的json.loads()(一般解决方案)来完成此操作,或者由于您正在使用python-requests,只需调用Response.json()方法即可:

data = res.json()

那么你有这个:

for recipe in data['recipes']:
    # ...

现在我们已经将data变成了正确的dict,我们可以访问data['recipes']的下标,但是直接在dict上进行迭代实际上是遍历键,而不是值,因此在上面的for循环recipe中将是一个字符串(“ 47635”,“ 65568”等)。如果要遍历值,则必须明确要求它:

for recipe in data['recipes'].values():
    # now `recipe` is the dict you expected