在外壳中,我有以下对象
[
{
"ParameterKey":"a",
"ParameterValue":"1"
},
{
"ParameterKey":"b",
"ParameterValue":"2"
},
{
"ParameterKey":"c",
"ParameterValue":"3"
},
{
"ParameterKey":"d",
"ParameterValue":"4"
}
]
我需要找出如何以最佳方式(例如,不使用数组索引)访问ParameterKey'b'和'd'。 jq,这样得到的数组将是:
[
{
"ParameterKey":"a",
"ParameterValue":"1"
},
{
"ParameterKey":"b",
"ParameterValue":"5"
},
{
"ParameterKey":"c",
"ParameterValue":"3"
},
{
"ParameterKey":"d",
"ParameterValue":"6"
}
]
答案 0 :(得分:1)
这将为ParameterName更改单个ParameterValue
jq '[.[] | select(.ParameterKey == "b") .ParameterValue |= "5"]'
[
{
"ParameterKey": "a",
"ParameterValue": "1"
},
{
"ParameterKey": "b",
"ParameterValue": "5"
},
{
"ParameterKey": "c",
"ParameterValue": "3"
},
{
"ParameterKey": "d",
"ParameterValue": "4"
}
]
如果您不想对键和值进行硬编码,则可以使用--arg
jq --arg key "b" --arg value "5" '[.[] | select(.ParameterKey == $key) .ParameterValue |= $value]' </tmp/data.json
[
{
"ParameterKey": "a",
"ParameterValue": "1"
},
{
"ParameterKey": "b",
"ParameterValue": "5"
},
{
"ParameterKey": "c",
"ParameterValue": "3"
},
{
"ParameterKey": "d",
"ParameterValue": "4"
}
]
希望这会有所帮助!
答案 1 :(得分:0)
不清楚您要问的是什么,但是以下jq过滤器解决了对该问题的一种解释:
map(if .ParameterKey == "b" then .ParameterValue = "5"
elif .ParameterKey == "d" then .ParameterValue = "6"
else . end)
这是使用单个JSON对象定义用于定义更新的键/值对的另一种方法:
map( {(.ParameterKey): .ParameterValue} )
| add + {b:"5", d:"6"}
| to_entries
| map( {ParameterKey: .key, ParameterValue: .value} )