json - 金青 |更新 `select` 选择的数组元素

标签 json jq

在 JSON 数组中,我想根据节点的值选择一个数组元素,然后更新同一数组元素中的不同节点。例如。在下面的 JSON 中:

{
"apiVersion": "vlabs",
"properties": {
    "orchestratorProfile": {
    "orchestratorType": "Kubernetes",
    "orchestratorRelease": "1.7",
    "orchestratorVersion": "1.7.10",
    "kubernetesConfig": {
        "kubernetesImageBase": "gcrio.azureedge.net/google_containers/",
        "clusterSubnet": "10.105.208.0/20",
        "networkPolicy": "calico",
        "nonMasqueradeCidr": "10.0.0.0/8",
        "maxPods": 110,
        "dockerBridgeSubnet": "172.17.0.1/16"
        "addons": [
        {
            "name": "tiller",
            "enabled": true
        },
        {
            "name": "aci-connector",
            "enabled": true
        },
        {
            "name": "kubernetes-dashboard",
            "enabled": true
        },
        {
            "name": "rescheduler",
            "enabled": true
        }
        ]
    }
    }
}
}

我想禁用所有不是“重新调度器”的插件,即为数组 .properties.orchestratorProfile.kubernetesConfig.addons[] 的元素设置 .enabled = false其中 .name != "rescheduler"。我能算出的最接近的是

jq -r '.properties.orchestratorProfile.kubernetesConfig.addons[] |
  select (.name != "rescheduler" ) | .enabled =  false'

但是这个,或者我尝试过的任何其他方法,我总是会丢失数组之外的数据。

预期的结果是:

{
"apiVersion": "vlabs",
"properties": {
    "orchestratorProfile": {
    "orchestratorType": "Kubernetes",
    "orchestratorRelease": "1.7",
    "orchestratorVersion": "1.7.10",
    "kubernetesConfig": {
        "kubernetesImageBase": "gcrio.azureedge.net/google_containers/",
        "clusterSubnet": "10.105.208.0/20",
        "networkPolicy": "calico",
        "nonMasqueradeCidr": "10.0.0.0/8",
        "maxPods": 110,
        "dockerBridgeSubnet": "172.17.0.1/16"
        "addons": [
        {
            "name": "tiller",
            "enabled": false
        },
        {
            "name": "aci-connector",
            "enabled": false
        },
        {
            "name": "kubernetes-dashboard",
            "enabled": false
        },
        {
            "name": "rescheduler",
            "enabled": true
        }
        ]
    }
    }
}
}

我该怎么做呢?提前感谢任何想法或帮助或指导。

最佳答案

除了缺少一对括号外,您的 jq 查询是正确的:

(.properties.orchestratorProfile.kubernetesConfig.addons[]
 | select (.name != "rescheduler" ).enabled) = false

即在赋值的LHS上,需要指定需要更新的值的路径。

关于json - 金青 |更新 `select` 选择的数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47774666/

相关文章:

json - 如何使用 jq 将这个嵌套对象转换为扁平对象?

iOS 9 解析JSON的最佳方案

sql - 如何在postgresql中将两行转换为键值json对象?

iphone - Json 或 CSV 到具有大量数据的 Web 服务

json - 使用jq检查JSON数据类型

json - 用 jq 解析嵌套的 json

json - 如何使用jq对对象进行展平的逆操作?

python - 防止 JSON 序列化在 Python 中抛出异常

json - Recursive Common Table Expression中的Postgres JSON操作错误

arrays - 使用 jq 为 JSON 数组运行计数器