Как взять пары ключ-значение и превратить их в массив объектов, используя JMESPath - PullRequest
0 голосов
/ 15 января 2019

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

Я просмотрел все JMESPath документы и примеров , не найдя конкретной структуры данных, с которой я работал. Я пытался использовать встроенные функции keys (@) и 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. Любое мнение эксперта будет с благодарностью.

1 Ответ

0 голосов
/ 23 марта 2019

Контекст

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

Ловушки

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

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

{"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 }
]}
...