如何使用jq更新json文档中嵌套对象数组中的单个值?

如何使用jq更新json文档中嵌套对象数组中的单个值?,json,edit,jq,in-place,Json,Edit,Jq,In Place,我有一个JSON文档,如下所示。注意:这是一个简化的真实JSON示例,包含在问题的底部: { "some_array": [ { "k1": "A", "k2": "XXX" }, { "k1": "B", "k2": "YYY" } ] } 我想更改some_数组中所有k2键的值,其中k1键的值为“B” 使用jq是否可能做到这一点 作为参考,这是实际的JSON文档,它是一个用于/tool的环境变量文件。我

我有一个JSON文档,如下所示。注意:这是一个简化的真实JSON示例,包含在问题的底部:

{
  "some_array": [
    {
      "k1": "A",
      "k2": "XXX"
    },
    {
      "k1": "B",
      "k2": "YYY"
    }
  ]
}
我想更改
some_数组中所有
k2
键的值,其中
k1
键的值为“B”

使用jq是否可能做到这一点

作为参考,这是实际的JSON文档,它是一个用于/tool的环境变量文件。我尝试使用JQ进行这种转换,因为该工具还不支持

实际JSON

{
  "name": "Local-Stack-Env-Config",
  "values": [
    {
      "enabled": true,
      "key": "KC_master_host",
      "type": "text",
      "value": "http://localhost:8087"
    },
    {
      "enabled": true,
      "key": "KC_user_guid",
      "type": "text",
      "value": "11111111-1111-1111-1111-11111111111"
    }
  ],
  "timestamp": 1502768145037,
  "_postman_variable_scope": "environment",
  "_postman_exported_at": "2017-08-15T03:36:41.474Z",
  "_postman_exported_using": "Postman/5.1.3"
}

以下是一个可行的解决方案:

cat some.json | jq '.some_array = (.some_array | map(if .k1 == "B" then . + {"k2":"changed"} else . end))'
生成输出:

  "some_array": [
    {
      "k1": "A",
      "k2": "XXX"
    },
    {
      "k1": "B",
      "k2": "changed"
    }
  ]
}

以下是一个可行的解决方案:

cat some.json | jq '.some_array = (.some_array | map(if .k1 == "B" then . + {"k2":"changed"} else . end))'
生成输出:

  "some_array": [
    {
      "k1": "A",
      "k2": "XXX"
    },
    {
      "k1": "B",
      "k2": "changed"
    }
  ]
}

这是另一个解决方案

jq '(.some_array[] | select(.k1 == "B") | .k2) |= "new_value"'
输出

{
  "some_array": [
    {
      "k1": "A",
      "k2": "XXX"
    },
    {
      "k1": "B",
      "k2": "new_value"
    }
  ]
}

这是另一个解决方案

jq '(.some_array[] | select(.k1 == "B") | .k2) |= "new_value"'
输出

{
  "some_array": [
    {
      "k1": "A",
      "k2": "XXX"
    },
    {
      "k1": "B",
      "k2": "new_value"
    }
  ]
}

下面是的筛选器的一个稍微简单的版本:

.some_array |= map(if .k1=="B" then .k2="changed" else . end)

下面是的筛选器的一个稍微简单的版本:

.some_array |= map(if .k1=="B" then .k2="changed" else . end)