[英]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 )'
這假設插入和刪除鍵( field2
和field3
)也是動態的,而不僅僅是插入的值。
--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"
}
]
}
演示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.