jq:如何有条件地更改数组值

问题描述 投票:1回答:1

我是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": "[email protected]"
             }
        ]
    },
    {
         "name": "breeze",
         "type": "dog",
         "contact_info": [
             {
                  "contact_type": "phone",
                  "value": "125-856-6789"
             },
             {
                  "contact_type": "email",
                  "value": "[email protected]"
             }
         ]
    }
]

生成的文件必须如下所示:

[
    {
         "name": "fluffy",
         "type": "cat",
         "contact_info": [
             {
                  "contact_type": "phone",
                  "value": "123-456-6789"
             },
             {
                  "contact_type": "email",
                  "value": "[email protected]"
             }
         ]
    },
    {
         "name": "breeze",
         "type": "dog",
         "contact_info": [
             {
                  "contact_type": "phone",
                  "value": "125-856-6789"
             },
             {
                  "contact_type": "email",
                  "value": "[email protected]"
             }
         ]
    }
]

请帮忙。

json edit jq
1个回答
1
投票

这是许多可能的解决方案之一:

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 .被删除。

© www.soinside.com 2019 - 2024. All rights reserved.