@Ivan_star

Обработка params ?fields в апи запросе для вывода в response?

У меня есть апи- запрос, который в response отдает множество подобных массивов json со сложной вложенностью, например
{
        "boardId": 1111,
        "boardSlug": "top",
        "boardUid": "dgfthtgt",
        "Data": {
            "Matches": [
                {
                    "m": "gp",
                    "t": {
                        "id": "51"
                        "zone": "1"
                    },
                    "value": 3296
                }
            ]
        },
        "id": 41925,
        "name": "W"
    },


При этом мне необходимо задавать в запросе ?fields те поля, который необходимо выводить в ответе, например ?fields=boardId,name,Data.Matches.t.id
Есть ли стандартный модуль py котрый умеет грамотно обрабатывать такое, и если нет, то где найти информацию по похожей обработке ?fields
Уточнение:
То есть, если я задам fields= boardId,Data.Matches.t.id,name то ответ должен быть:
{
        "boardId": 1111,
        "Data": {
            "Matches": [
                {
                    "t": {
                        "id": "51"
                    }
                }
            ]
        }
        "name": "W"
    },
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Рекурсивно делай. Опиши требуемую функцию:
def filter_fields(obj: dict[str, ...], fields: list[str]) -> dict[str, ...]:
    """obj - фильтруемый словарь, fields - множество полей, которые надо оставить."""
    ...

Проблема в том, что поля могут быть вложенным. Тогда первым делом составляешь набор нужных тебе полей верхнего уровня:
top_level_fields = {}
for f in fields:
    top, _, bottom = f.partition('.')
    top_level_fields.setdefault(top, [])
    if bottom is not None:
        top_level_fields[top].append(bottom)

Для
fields=['boardId', 'name', 'Data.Matches.t.id', 'Data.Matches.m']
в top_level_fields получишь
{ 'boardId': [], 'name': [], 'Data': ['Matches.t.id', 'Matches.m']}

Дальше перебираешь поля, собираешь их значения в один мешок и смотришь, есть ли для них нижележащие поля:
output = {}
for top, bottom in top_level_fields.items():
    if bottom:
        output[top] = filter_fields(obj[top], bottom)  # что делать, если ключа top нет?
    else:
        output[top] = obj[top]

Таким образом наберёшь всё, что надо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
SpectrumData Екатеринбург
от 150 000 до 250 000 ₽
Гринатом Москва
от 150 000 ₽
DIGITAL SECTOR Краснодар
от 150 000 до 250 000 ₽
16 июл. 2024, в 08:58
50000 руб./за проект
16 июл. 2024, в 08:35
70000 руб./за проект
16 июл. 2024, в 03:57
5000 руб./за проект