dr.*_*ion 6 shell command-line json jq
我有以下JSON示例:
[
{
"name": "val1",
"expire": { "$value": 10 }
},
{
"name": "val2",
"expire": 20
},
{
"name": "val3"
}
]
Run Code Online (Sandbox Code Playgroud)
我想用jq将其转换为这种形式:
[
{
"name": "val1",
"expire": 10
},
{
"name": "val2",
"expire": 20
},
{
"name": "val3",
"expire": null
}
]
Run Code Online (Sandbox Code Playgroud)
我发现的所有内容都是if-then-else,但似乎我不知道如何构建正确的表达方式。
基于类型检查的条件,看起来像是正确的方法,但是只返回“编译”时错误,我不知道如何解决:
.[] | { name, expire: (if .expire then (if type(.expire) == "number" then .expire else .expire."$value" end) else null end) }
Run Code Online (Sandbox Code Playgroud)
基于"$value"检查的条件,以某种方式过滤掉第二个对象:
.[] | { name, expire: (if .expire then (if .expire."$value"? then .expire."$value" else .expire end) else null end) }
Run Code Online (Sandbox Code Playgroud)
据我了解,内部的问题是,如果第二个对象使用进行了检查.expire."$value"?,则抛出错误,并且由于错误而从结果中删除了对象。
试试这个过滤器:
map( {name,
"expire": (.expire | if type == "object" then .["$value"] elif type == "number" then . else null end) } )
Run Code Online (Sandbox Code Playgroud)
或(在边缘情况下语义显着不同):
map(.expire |= if type == "object" then .["$value"]
elif type == "number" then . else null end)
Run Code Online (Sandbox Code Playgroud)