簡體   English   中英

在JSON jq中修改鍵值數組

[英]Modifying array of key value in JSON jq

在這種情況下,我有一個原始的json看起來如下:

{
  "taskDefinition": {
    "containerDefinitions": [
      {
        "name": "web",
        "image": "my-image",
        "environment": [
          {
            "name": "DB_HOST",
            "value": "localhost"
          },
          {
            "name": "DB_USERNAME",
            "value": "user"
          }
        ]
      }
    ]
  }
}

我想原樣修改匹配鍵的值,如下所示:

jq '.taskDefinition.containerDefinitions[0].environment[] | select(.name=="DB_USERNAME") | .value="new"' json

我得到了輸出

{
  "name": "DB_USERNAME",
  "value": "new"
}

但我希望更多像就地修改或原始的整個json修改新值,如下所示:

{
      "taskDefinition": {
        "containerDefinitions": [
          {
            "name": "web",
            "image": "my-image",
            "environment": [
              {
                "name": "DB_HOST",
                "value": "localhost"
              },
              {
                "name": "DB_USERNAME",
                "value": "new"
              }
            ]
          }
        ]
      }
    }

是否可以使用jq或任何已知的解決方法?

謝謝。

更新

對於任何尋找編輯多值的人來說,這是我使用的方法

JQ=""
for e in DB_HOST=rds DB_USERNAME=xxx; do
    k=${e%=*}
    v=${e##*=}
    JQ+="(.taskDefinition.containerDefinitions[0].environment[] | select(.name==\"$k\") | .value) |= \"$v\" | "
done

jq '${JQ%??}' json

我認為應該有更簡潔的方式,但這似乎工作正常。

如果您使用|= ,則分配給路徑就足夠了,例如

jq '
  (.taskDefinition.containerDefinitions[0].environment[] | 
   select(.name=="DB_USERNAME") | .value) |= "new"
' infile.json

輸出:

{
  "taskDefinition": {
    "containerDefinitions": [
      {
        "name": "web",
        "image": "my-image",
        "environment": [
          {
            "name": "DB_HOST",
            "value": "localhost"
          },
          {
            "name": "DB_USERNAME",
            "value": "new"
          }
        ]
      }
    ]
  }
}

您可能想要考慮使用|=替代方法:

walk( if type=="object" and .name=="DB_USERNAME" 
      then .value="new" else . end)

這是一個使用|=的無選擇解決方案:

.taskDefinition.containerDefinitions[0].environment |=
  map(if .name=="DB_USERNAME" then .value = "new"
      else . end)

避免在LHS的表達式中select |=使得解決方案在使用jq的版本時更加健壯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM