Python TypeError:字符串索引必须是整数

2024-06-25 06:28:22 发布

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

我有下面的Python代码

from flask import Flask, jsonify, json

app = Flask(__name__)

with open('C:/test.json', encoding="latin-1") as f:
    dataset = json.loads(f.read())

@app.route('/api/PDL/<string:dataset_identifier>', methods=['GET'])
def get_task(dataset_identifier):
    global dataset
    dataset = [dataset for dataset in dataset if dataset['identifier'] == dataset_identifier]
    if len(task) == 0:
        abort(404)
    return jsonify({'dataset': dataset})

if __name__ == '__main__':
    app.run(debug=True)

在测试.json看起来像这样:

^{pr2}$

当我像这样在URL中传递变量时:http://127.0.0.1:5000/api/PDL/1403 我得到以下错误:TypeError: string indices must be integers

知道“identifier”字段是一个字符串,我将在URL中传递以下内容:

http://127.0.0.1:5000/api/PDL/"US-XYZ-ABC-36"
http://127.0.0.1:5000/api/PDL/US-XYZ-ABC-36

我一直收到以下错误:

TypeError: string indices must be integers

你知道我遗漏了什么吗?我是Python新手!在


Tags: nameapijsonapphttpurlflasktask
2条回答

问题是您试图迭代字典而不是其中的数据源列表。因此,您将遍历字典的键,这些键是字符串。如果你用上面提到的变量的名字,或者你会用同样的名字。在

这对我很有效:

[ds for ds in dataset['dataset'] if ds['identifier'] == dataset_identifier]

现在的问题是,在列表理解中的迭代期间,第一次迭代将名称datasetdict的意思改为dict的键(dicts迭代它们的键)。所以当你试图用dataset['identifier']dataset中查找一个值,dataset不再是{},而是你当前正在迭代的str键。在

停止重复使用同一个名字来表达不同的意思。在

从您发布的JSON中,您可能想要的是:

with open('C:/test.json', encoding="latin-1") as f:
    alldata = json.loads(f.read())

@app.route('/api/PDL/<string:dataset_identifier>', methods=['GET'])
def get_task(dataset_identifier):
    # Gets the list of data objects from top level object
    # Could be inlined into list comprehension, replacing dataset with alldata['dataset']
    dataset = alldata['dataset']
    # data is a single object in that list, which should have an identifier key
    # data_for_id is the list of objects passing the filter
    data_for_id = [data for data in dataset if data['identifier'] == dataset_identifier]
    if len(task) == 0:
        abort(404)
    return jsonify({'dataset': data_for_id})

相关问题 更多 >