Как взять пары ключ-значение и превратить их в массив объектов с помощью JMESPath

Я хочу изменить структуру данных стороннего API с помощью JMESPath и не смог понять, как взять один объект пар ключ-значение и преобразовать его в массив объектов, каждый из которых содержит ключ-значение. пары.

Я просмотрел все документы JMESPath и examples, не обнаружив конкретной структуры данных, с которой я работал. Я пробовал использовать клавиши (@) и values ​​(@) встроенные функции для получения ключа и значений эти пары, но не смогли объединить их в единый массив.

Вот мои исходные данные JSON

{
"time": 32,
    "terms": {
        "192.168.10.121": 84,
        "154.223.10.121": 12,
        "112.149.10.121": 6
    }
}

Я пытаюсь преобразовать указанные выше данные JSON в следующую структуру с помощью JMESPath.

{
"data": [
    { "ip_address": "192.168.10.121", "count": 84 },
    { "ip_address": "154.223.10.121", "count": 12 },
    { "ip_address": "112.149.10.121", "count": 6 }
]}

Мне удалось создать массив ключей или массив значений, но не удалось создать массив объектов, содержащих пары ключ-значение. terms.{ data: keys(@)} terms.{ data: values(@)}

Результат при использовании terms.{ data: keys(@)}

{
"data": [
    "192.168.10.121",
    "154.223.10.121",
    "112.149.10.121"
]}

Результат при использовании terms.{ data: values(@)}

{
"data": [
    84,
    12,
    6
]}

Эти две функции кажутся единственными функциями, которые я могу использовать для извлечения ключей и значений из объекта, содержащего пары ключ-значение, изначально не входящие в массив. Насколько я могу судить, я не могу объединить обе эти функции для вывода одного массива, как в моем примере выше.

Я даже не уверен, что это возможно с помощью JMESPath. Приветствуются любые мнения экспертов.


person RS_Trailer_Park    schedule 15.01.2019    source источник


Ответы (1)


Контекст

  • язык запросов jmespath
  • как повторно нормализовать данные из одной структуры (схемы) в другую
  • как эффективно перебирать и фильтровать свойства объекта (пары имя-значение)

Ловушки

  • Вообще говоря, jmespath очень гибок при итерации последовательно индексированных массивов, но гораздо менее гибок при итерации по свойствам объекта.
  • Большинство преобразований с помощью jmespath становятся чрезвычайно громоздкими, когда целью является перебор свойств объекта.
  • Обычно вы можете произвести любой произвольный вывод в jmespath, если вы хотите «вручную создать» вывод вручную ... это обычно компромисс при работе с итерацией по свойствам объекта (также известным как пары имя-значение)

Пример

Учитывая следующий исходный набор данных ...

{"time": 32,
    "terms": {
        "192.168.10.121": 84,
        "154.223.10.121": 12,
        "112.149.10.121": 6
    }
}

... следующий запрос jmespath ...

{"data": [
  { "ip_address": @.terms|keys(@)[0], "count": @.terms|values(@)[0] }
  ,{ "ip_address": @.terms|keys(@)[1], "count": @.terms|values(@)[1] }
  ,{ "ip_address": @.terms|keys(@)[2], "count": @.terms|values(@)[2] }
]}

... дает следующий результат

{"data": [
    { "ip_address": "192.168.10.121", "count": 84 },
    { "ip_address": "154.223.10.121", "count": 12 },
    { "ip_address": "112.149.10.121", "count": 6 }
]}
person dreftymac    schedule 23.03.2019