如何 return JSON Flask 中的对象(字典列表)API

How to return JSON objects (List of Dictionaries) in Flask API

这里是新手,坚持将一些对象从 JSON 返回到我的 Flask API。

我有一个名为数据的字典列表,您将在下面的代码中看到。我需要检查 status_id 是否在数据中。如果是,我必须显示该用户的名称。我如何从列表中访问字典?还是我的 json 无效?我确实使用了 linter 来检查它并通过了 JSON 测试。我收到错误:字符串索引必须是整数。这让我相信,因为它是一个列表,所以我需要整数作为索引。

任何正确方向的帮助都会很棒。

这是我的代码:

@app.route("/status/<status_id>", methods=['GET'])
def get_status(status_id):
    data = [{
                "id": 5,
                "name": "Meghan"
            },
            {
                "id": 6,
                "name": "Julia"
            }
        ]

    data_dump = json.dumps(data, indent=4)

    if status_id in data_dump:
        #find that status id and name and return it
        return data_dump[status_id]['name']
    else:
        return "Not Found in Dictionary"

对我来说,您似乎想要 return id == status_id 所在对象的名称。那正确吗?比起您不必将其转储到 json。您可以检查 status_id 是否存在于列表中:

len(list(filter(lambda x: x['id'] == status_id, data))) == 1

解释:

list(filter(lambda x: x['id'] == status_id, data))

这会过滤您的词典列表,使其仅包含具有匹配 ID 的词典。

len(...) == 1

这会检查是否只有一个对象具有此 ID。如果你想 return 正是那个字典的名字,你可以这样写:

matching_dict = list(filter(lambda x: x['id'] == status_id, data))
if len(matching_dict) == 1:
    return matching_dict[0]['name']

如果您想要 return json(作为字符串)。然后你必须调用 json.dumps() 就像 json.dumps(matching_dict[0]) 取决于你想做什么。

编辑:所以将所有内容放在一起看起来像这样:

@app.route("/status/<status_id>", methods=['GET'])
def get_status(status_id):
    data = [{
                "id": 5,
                "name": "Meghan"
            },
            {
                "id": 6,
                "name": "Julia"
            }
        ]

    matching_dict = list(filter(lambda x: x['id'] == status_id, data))
    if len(matching_dict) == 1:
        return json.dumps(matching_dict[0])
    else:
        return "Found zero or more than one in Dictionary"

请求:GET /status/5

响应:{"id":5, "name": "Meghan"}

见下文。 get_status 函数的简化版本。

注意HTTP状态码(200比404)

@app.route("/status/<status_id>", methods=['GET'])
def get_status(status_id):
    data = [{
        "id": 5,
        "name": "Meghan"
    },
        {
            "id": 6,
            "name": "Julia"
        }
    ]
    name = None
    for entry in data:
        if entry['id'] == status_id:
            name = entry['name']
            break
    if name is not None:
        print('The name for status_id {} is {}'.format(status_id,name))
        return name, 200
        # or, if you want to return both use Flask jsonify and send a dict
        # see http://flask.pocoo.org/docs/1.0/api/#flask.json.jsonify
    else:
        print('Can not find a name for status id {}'.format(status_id))
        return "Not Found in Dictionary", 404