@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"
    },
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 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]

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

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

Похожие вопросы