jq: Как мне изменить форму объекта, используя множественные выделения в качестве значений? - PullRequest
1 голос
/ 03 марта 2020

JSON

[
      {
        "name": "username",
        "value": "my-username"
      },
      {
        "name": "password",
        "value": "my-password"
      }
]

Желаемый результат

{ "username": "my-username", "password": "my-password" }

Несколько неудачных попыток

.[] | { username: select(.name == "username").value, password: select(.name == "password").value }

Нет вывода

.[] | { username: select(.name == "username").value} + { password: select(.name == "password").value }

Нет вывода

.[] | { username: select(.name == "username").value } + .[] | { password: select(.name == "password").value }

Ошибка

Если мне нужно только одно поле, синтаксис работает нормально. Например,

.[] | { username: select(.name == "username").value }

производит

{ "username": "my-username" }

Единственная проблема заключается в попытке сделать то же самое с несколькими элементами.

Мысли? Спасибо!

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Если ваше выражение начинается с .[] |, а затем вещь после | производит объект, то вы должны создавать 0 или 1 объект на элемент массива . Но вы знаете, что это не то, что вы хотите. Вам нужен один объект, поэтому вы должны начать с создания объекта.

{ 
    username: (.[] | select(.name == "username").value), 
    password: (.[] | select(.name == "password").value) 
}

похоже на то, что вы делаете в данный момент, но это работает.

Вы также можете сделать map({ key: .name, value }) | from_entries как лучший способ сделать то же самое: он использует встроенную в jq from_entries, чтобы превратить массив пар ключ / значение в объект. Вам просто нужно изменить свой ключ name на key, чего и ожидает from_entries.

0 голосов
/ 04 марта 2020

Как это происходит, jq (версия 1.5 или более поздняя) уже понимает метод {"name":_, "value":_} представления объекта JSON, поэтому вы можете достичь результата, просто используя фильтр jq:

from_entries
...