Как вернуть объекты JSON (Список словарей) в Flask API - PullRequest
0 голосов
/ 10 июля 2019

Новичок здесь и застрял при возврате некоторых объектов из JSON в мой Flask API.

У меня есть список словарей с данными, вы увидите в моем коде ниже.Мне нужно проверить, есть ли status_id в данных.Если это так, я должен отобразить имя этого пользователя.Как бы я получить доступ к словарю из списка?Или мой JSON не действителен?Я использовал линтер для проверки, и он прошел тест 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"

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Смотри ниже. Упрощенная версия функции 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
1 голос
/ 10 июля 2019

Для меня кажется, что вы хотите вернуть имя объекта, где 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))

Это фильтрует ваш список словарей, чтобы иметь только те словари, которые имеют соответствующий идентификатор.

len(...) == 1

Это проверяет, существует ли только один и точно один объект с таким идентификатором. Если вы хотите вернуть имя именно этого диктанта, вы можете написать его так:

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

И если вы хотите вернуть 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"}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...