使用 jq 有条件地修改对象属性
Modify object properties conditionally with jq
我有 JSON 的样本:
[
{
"name": "val1",
"expire": { "$value": 10 }
},
{
"name": "val2",
"expire": 20
},
{
"name": "val3"
}
]
我想用jq把它改成这样的形式:
[
{
"name": "val1",
"expire": 10
},
{
"name": "val2",
"expire": 20
},
{
"name": "val3",
"expire": null
}
]
我发现的都是 if-then-else,但看起来我不知道如何构建正确的表达式。
基于类型检查的条件,它看起来是正确的方法,但只是 return "compile"-时间错误,我不知道如何修复它:
.[] | { name, expire: (if .expire then (if type(.expire) == "number" then .expire else .expire."$value" end) else null end) }
条件基于"$value"
检查,以某种方式过滤掉第二个对象:
.[] | { name, expire: (if .expire then (if .expire."$value"? then .expire."$value" else .expire end) else null end) }
据我了解,这里的问题在内部 if 中,第二个对象使用 .expire."$value"?
检查时,抛出了错误,并且由于错误而从结果中删除了对象。
试试这个过滤器:
map( {name,
"expire": (.expire | if type == "object" then .["$value"] elif type == "number" then . else null end) } )
或(在边缘情况下具有显着不同的语义):
map(.expire |= if type == "object" then .["$value"]
elif type == "number" then . else null end)
您可以将其视为另一种方式,即用 "$value"
(如果存在)或当前值更新每个对象的 expire
属性。如果该值不存在,则只是 null
.
.[].expire |= (."$value"? // .)
我有 JSON 的样本:
[
{
"name": "val1",
"expire": { "$value": 10 }
},
{
"name": "val2",
"expire": 20
},
{
"name": "val3"
}
]
我想用jq把它改成这样的形式:
[
{
"name": "val1",
"expire": 10
},
{
"name": "val2",
"expire": 20
},
{
"name": "val3",
"expire": null
}
]
我发现的都是 if-then-else,但看起来我不知道如何构建正确的表达式。
基于类型检查的条件,它看起来是正确的方法,但只是 return "compile"-时间错误,我不知道如何修复它:
.[] | { name, expire: (if .expire then (if type(.expire) == "number" then .expire else .expire."$value" end) else null end) }
条件基于"$value"
检查,以某种方式过滤掉第二个对象:
.[] | { name, expire: (if .expire then (if .expire."$value"? then .expire."$value" else .expire end) else null end) }
据我了解,这里的问题在内部 if 中,第二个对象使用 .expire."$value"?
检查时,抛出了错误,并且由于错误而从结果中删除了对象。
试试这个过滤器:
map( {name,
"expire": (.expire | if type == "object" then .["$value"] elif type == "number" then . else null end) } )
或(在边缘情况下具有显着不同的语义):
map(.expire |= if type == "object" then .["$value"]
elif type == "number" then . else null end)
您可以将其视为另一种方式,即用 "$value"
(如果存在)或当前值更新每个对象的 expire
属性。如果该值不存在,则只是 null
.
.[].expire |= (."$value"? // .)