JQ: как изменить значение массива условно - PullRequest
1 голос
/ 12 марта 2019

Я новичок в JSON и JQ. Я искал интернет, но не мог найти решение для моей проблемы. У меня есть файл JSON с каждым объектом, содержащим массив. Мне нужно условно изменить некоторые элементы массива: если contact_type = email и значение типа "yahoo.com", заменить "yahoo.com" на "hotmail.com". Мой файл:

[  
    {
        "name": "fluffy",
        "type": "cat",
        "contact_info": [
             {
                 "contact_type": "phone",
                 "value": "123-456-6789"
             },
             {
                 "contact_type": "email",
                 "value": "fluffy_mean_cat@gmail.com"
             }
        ]
    },
    {
         "name": "breeze",
         "type": "dog",
         "contact_info": [
             {
                  "contact_type": "phone",
                  "value": "125-856-6789"
             },
             {
                  "contact_type": "email",
                  "value": "breeze@yahoo.com"
             }
         ]
    }
]

Результирующий файл должен выглядеть так:

[
    {
         "name": "fluffy",
         "type": "cat",
         "contact_info": [
             {
                  "contact_type": "phone",
                  "value": "123-456-6789"
             },
             {
                  "contact_type": "email",
                  "value": "fluffy_mean_cat@gmail.com"
             }
         ]
    },
    {
         "name": "breeze",
         "type": "dog",
         "contact_info": [
             {
                  "contact_type": "phone",
                  "value": "125-856-6789"
             },
             {
                  "contact_type": "email",
                  "value": "breeze@hotmail.com"
             }
         ]
    }
]

Пожалуйста, помогите.

1 Ответ

1 голос
/ 12 марта 2019

Вот одно из многих возможных решений:

walk( if type == "object"
        and .contact_type == "email"
        and (.value | index("yahoo.com"))
      then .value |= sub("yahoo.com"; "hotmail.com")
      else . end )

Прямой подход

def update:
  if .contact_type == "email"
     and (.value | index("yahoo.com"))
  then .value |= sub("yahoo.com"; "hotmail.com")
  else . 
  end ;

map( if .contact_info 
     then .contact_info |= map(update)
     else .
     end )

else .

После выпуска jq 1.6 было внесено изменение, позволяющее сбросить else ..

...