【问题标题】:jq: how to change array value conditionallyjq:如何有条件地更改数组值
【发布时间】:2019-03-11 23:29:04
【问题描述】:

我是 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"
             }
         ]
    }
]

请帮忙。

【问题讨论】:

  • 或者你可以看看jsonnet.org来解决这个问题。

标签: json edit jq


【解决方案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 .

【讨论】:

  • jq 1.5 中是否有替代解决方案?由于walk(f) 函数不在 jq 1.5 中。
  • 是的,但是您可以复制并粘贴walk 的定义。只需谷歌:jq def walk
猜你喜欢
  • 2020-11-22
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多