我一直在努力让这个工作好几天,但我被困住了。
我有一个json数据结构,其中包含我想要更新的值,主要是使用我的json作为数据库来存储配置值。这是我的JSON:
{
"Actions": [
{
"Number": 1012,
"RollbackPoint": "xxx_1012_RollbackPoint_xxx",
"Parameters": [
{
"Name": "accountType",
"Value": "xxx_1012_accountType_xxx"
},
{
"Name": "userPassword",
"Value": "xxx_1012_userPassword_xxx"
}
]
},
{
"Number": 1015,
"RollbackPoint": "xxx_1015_RollbackPoint_xxx",
"Parameters": [
{
"Name": "accountType",
"Value": "xxx_1015_accountType_xxx"
},
{
"Name": "skipExport",
"Value": "xxx_1015_skipExport_xxx"
}
]
}
]
}
我想要执行两次更新
到目前为止,我最接近的是使用它:
cat json.txt | jq '.[] | map(. + {RollbackPoint:(if (."Number") == 1015 then "1015" else .RollbackPoint end)})'
但是这会删除Actions []元素,因此对我没有好处,我也不知道从哪里开始更新2 ...
任何帮助都会非常感激,谷歌超过5个小时,我仍然不在附近。
非常感谢 马特
答案 0 :(得分:8)
您可以使用//
运算符来模仿(IMHO)更好的if-else树以及各种过滤过滤器。与大型的if-else树相比,它更容易理解。
.Actions |= map(
(select(.Number == 1015) |
.RollbackPoint = "1012"
) //
(select(.Number == 1012) |
.Parameters |= map((select(.Name == "accountType") | .Value = "AWS") // .)
) //
.
)
答案 1 :(得分:0)
这是另一个jq解决方案
.Actions[] |= (
if .Number == 1015 then .RollbackPoint = "1012" else . end
| if .Number == 1012 then .Parameters[] |= (
if .Name == "accountType" then .Value = "AWS" else . end
) else . end
)