jq条件更新数组元素

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

我想根据同一个数组中另一个元素的值有条件地更新元素值。

例如,我想找到name ==“weather”并将检查从“true”更改为“false”

[
  {
    "originalSourceId": null,
    "sourceConnection": {
      "id": null,
      "version": null,
      "properties": [
        {
          "id": null,
          "version": null
        }
      ],
      "name": "POSTGRESQL",
      "businessName": null
    },
    "checked": true,
    "newlyAdded": false,
    "discoveredEntities": [
      {
        "name": "weather",
        "checked": true,
        "checkedBeforeEdit": false,
        "storeFieldsAsStrings": false
      },
      {
        "name": "weather_2",
        "checked": true,
        "checkedBeforeEdit": false,
        "storeFieldsAsStrings": false
      }
    ],
    "defaultLevel": "MANAGED"
  }
]

对于名称=“天气”的同一对象,checked元素将更新为“false”

[
  {
    "originalSourceId": null,
    "sourceConnection": {
      "id": null,
      "version": null,
      "properties": [
        {
          "id": null,
          "version": null
        }
      ],
      "name": "POSTGRESQL",
      "businessName": null
    },
    "checked": true,
    "newlyAdded": false,
    "discoveredEntities": [
      {
        "name": "weather",
        "checked": false,
        "checkedBeforeEdit": false,
        "storeFieldsAsStrings": false
      },
      {
        "name": "weather_2",
        "checked": true,
        "checkedBeforeEdit": false,
        "storeFieldsAsStrings": false
      }
    ],
    "defaultLevel": "MANAGED"
  }
]
json if-statement edit jq
3个回答
1
投票

对于这些类型的更新,如果您以这种方式考虑它,更容易可视化,首先找到要更新的项目,然后更新它们。

 (.[].discoveredEntities[] | select(.name == "weather").checked) = false
#[ locate the items to update                         ]
#                                                      [ update them   ]

0
投票

弄清楚了。

jq '[.[].discoveredEntities[] |= if (.name=="weather") then (.checked = "false") else . end]'\
    ./test.json

0
投票

在这里使用map产生一个非常简单的行人解决方案:

map( .discoveredEntities |=
        map(if .name == "weather" then .checked = false else . end))

请注意,在这里使用false而不是"false"显然更合适。

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