Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json JQ |更新由`选择'选择的数组元素`_Json_Jq - Fatal编程技术网

Json JQ |更新由`选择'选择的数组元素`

Json JQ |更新由`选择'选择的数组元素`,json,jq,Json,Jq,在JSON数组中,我希望根据节点的值选择一个数组元素,然后更新同一数组元素中的另一个节点。例如,在下面的JSON中: { "apiVersion": "vlabs", "properties": { "orchestratorProfile": { "orchestratorType": "Kubernetes", "orchestratorRelease": "1.7", "orchestratorVersion": "1.7.10", "kuberne

在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!=“重新调度程序”
。我能做的最接近的是

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

jq '.properties.orchestratorProfile.kubernetesConfig.addons = 
     [.[] | if .name != "rescheduler" then .enabled = false else . end]' file

除了缺少一对括号外,您的jq查询非常准确:

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

也就是说,在赋值的LHS上,您需要指定需要更新的值的路径。

我不知道我可以使用这样的括号!谢谢你的回答。