JMESPath как написать запрос с многоуровневым фильтром?

Я изучал официальную документацию JMESPath и некоторых других ресурсов. Однако мне не удалось выполнить следующую задачу:

моя структура данных - это json из vimeo api (список видео): массив данных содержит множество объектов, каждый объект - это загруженный файл с множеством атрибутов и различными параметрами.

    "data": [
        {
          "uri": "/videos/00001",
          "name": "Video will be added.mp4",
          "description": null,
          "type": "video",
          "link": "https://vimeo.com/00001",
          "duration": 9,
          "files":[
             {
              "quality": "hd",
              "type": "video/mp4",
              "width": 1440,
              "height": 1440,
              "link": "https://player.vimeo.com/external/4443333.sd.mp4",
              "created_time": "2020-09-01T19:10:01+00:00",
              "fps": 30,
              "size": 10807854,
              "md5": "643d9f18e0a63e0630da4ad85eecc7cb",
              "public_name": "UHD 1440p",
              "size_short": "10.31MB"
            },
            {
              "quality": "sd",
              "type": "video/mp4",
              "width": 540,
              "height": 540,
              "link": "https://player.vimeo.com/external/44444444.sd.mp4",
              "created_time": "2020-09-01T19:10:01+00:00",
              "fps": 30,
              "size": 1345793,
              "md5": "cb568939bb7b276eb468d9474c1f63f6",
              "public_name": "SD 540p",
              "size_short": "1.28MB"
            },
            ... other data
          ]
        },
   ... other uploaded files
]

Фильтр, который мне нужно применить, заключается в том, что продолжительность должна быть меньше 10, а ширина файла должна быть 540, а результат должен содержать ссылку (URL-адрес) из файлов.

Мне удалось заставить работать только один из структурных уровней: data[].files[?width == '540'].link

Мне нужно извлечь такой список

[
 {
 "uri": "/videos/111111",
 "link": "https://player.vimeo.com/external/4123112312.sd.mp4"
 },
 {
 "uri": "/videos/22222",
 "link": "https://player.vimeo.com/external/1231231231.sd.mp4"
 },
...other data
]

person Binuralka    schedule 13.02.2021    source источник


Ответы (1)


Поскольку продолжительность находится в вашем массиве data, вам нужно будет добавить этот фильтр на этом уровне.

Вам также придется использовать то, что описано в разделе фильтрация и выбор вложенных data, потому что вы заботитесь только об одном конкретном типе файла в массиве files, поэтому вы можете использовать тот же тип структуры запроса | [0] для извлечения только первого элемента отфильтрованного массива files.

Итак, в вашем сокращенном примере запрос:

data[?duration < `10`].{ uri: uri, link: files[?width == `540`].link | [0] }

Дало бы ожидаемое:

[
  {
    "uri": "/videos/00001",
    "link": "https://player.vimeo.com/external/44444444.sd.mp4"
  }
]
person β.εηοιτ.βε    schedule 13.02.2021
comment
большое спасибо! Я использовал этот фильтр прямо на jsoneditoronline.org и очень быстро получил свои данные - person Binuralka; 16.02.2021