簡體   English   中英

使用 jq 從 JSON 文件中刪除和添加鍵值

[英]Removing and adding key-value from JSON file using jq

我有一個 json 文件如下 -

{
  "key1": [
    "value1"
  ],
  "key2": [
    "value2"
  ],
  "key3": [
    "value3"
  ],
  "key4": {
    "name": "value4"
  },
  "key5": [
    {
      "field1": "abc",
      "field2": "xyz"
    }
  ]
}

我想從 key5 數組中刪除字段 2 並使用 jq 在 key5 數組中添加另一個字段 field3 我嘗試了各種方法但無法弄清楚如何在單個命令中執行此操作。 你能幫忙嗎? 提前致謝

.key5[] |= (... )允許您修改在.key5找到的數組的每個元素。

其中,我們可以使用通常的命令來刪除和添加字段。

jq '.key5[] |= ( del( .field2 ) | .field3 = "foo" )'

jqplay中的演示

將要添加的值作為命令行參數提供:

jq --arg val foo '.key5[] |= ( del( .field2 ) | .field3 = $val )'

這假設插入和刪除鍵( field2field3 )也是動態的,而不僅僅是插入的值。

  • 使用--arg--argjson使用過濾器外部的值初始化變量,這里field2作為字符串, {"field3": "new"}作為 JSON object
  • 在要更改的元素上使用更新運算符|= ,此處.key5[]
    • 注意: .key5是一個數組,而不是 object,因此它沒有字段。 但是該數組確實包含對象作為其元素。 使用.key5[]訪問數組元素將更新數組中的所有對象。 要僅更新其中一個,例如第一個,請改用.key[0]
  • 使用delpaths刪除給定的路徑,這里是頂級字段[$delkey]
  • 使用簡單的加法+添加一個新的鍵/值對作為 object,這里是$add
jq --arg delkey 'field2' --argjson addobj '{"field3": "new"}' '
  .key5[] |= delpaths([[$delkey]]) + $addobj
' input.json
{
  "key1": [
    "value1"
  ],
  "key2": [
    "value2"
  ],
  "key3": [
    "value3"
  ],
  "key4": {
    "name": "value4"
  },
  "key5": [
    {
      "field1": "abc",
      "field3": "new"
    }
  ]
}

演示

如果要單獨提供新對象的鍵和值,即作為字符串,而不是作為預先組合的 JSON,則需要第三個輸入變量

jq --arg delkey 'field2' --arg addkey 'field3' --arg addval 'new' '
  .key5[] |= (delpaths([[$delkey]]) | .[$addkey] = $addval)
' input.json

演示

嘗試過濾器:

del(.key5[0].field2) | .key5[0] |= .+{field3:"foo"}

Output:

{
  "key1": [
    "value1"
  ],
  "key2": [
    "value2"
  ],
  "key3": [
    "value3"
  ],
  "key4": {
    "name": "value4"
  },
  "key5": [
    {
      "field1": "abc",
      "field3": "foo"
    }
  ]
}

演示

https://jqplay.org/s/EB8MpWRxU2

暫無
暫無

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

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