Как использовать JQ для получения значения из словаря значения ключа в JSON - PullRequest
0 голосов
/ 30 апреля 2020

Мне нужно получить имя пользователя и адрес электронной почты для каждого пользователя в JSON ниже.

Хитрость заключается в том, что каждое свойство пользователя хранится в словаре пар имя-значение. Число пар имя-значение не является фиксированным, и порядок свойства адреса электронной почты также не является фиксированным.

{
  "Users": [
    {
      "Username": "test",
      "Attributes": [
        {
          "Name": "department",
          "Value": "department 1"
        },
        {
          "Name": "random attribute",
          "Value": "random attribute value"
        },
        {
          "Name": "email",
          "Value": "test@gmail.com"
        }
      ]
    },
    {
      "Username": "test2",
      "Attributes": [
        {
          "Name": "email",
          "Value": "test2@gmail.com"
        },
        {
          "Name": "department",
          "Value": "department 1"
        }
      ]
    }
  ]
}

Я хочу извлечь каждого пользователя и его адрес электронной почты следующим образом:

{
  "Username": "test",
  "email": "test@gmail.com"
},
{
  "Username": "test2",
  "email": "test2@gmail.com"
}

Самая близкая, которую я получил, была эта запутанная строка:

.Users[] | (.Attributes | map (contains ( {Name:"email", Value: "test@gmail.com"} )) | any(.))

, которая возвращает

true
false

1 Ответ

1 голос
/ 30 апреля 2020

Сначала вы должны выполнить итерацию по массиву Users, сформировать JSON с именем пользователя и полем Value внутри массива Attributes с именем ключа в качестве электронного письма. Затем выберите поле электронной почты, содержащее @

.Users[] | { Username, email : .Attributes[].Value } | select(.email | contains("@"))
...