真正的问题有点复杂,但我对以下json格式有问题。
命令:
echo '[{"user":"a","title":"aaa"},{"user":"b","title":null}]' | jq '.[]'
外:
{
"user": "a",
"title": "aaa"
}
{
"user": "b",
"title": null
}
我想:
{
"user": "a",
"title": "aaa"
}
{
"user": "b"
}
所以我这样做:
echo '[{"user":"a","title":"aaa"},{"user":"b","title":null}]' | jq '.[]|{user:.user, title:(.title//empty)}'
结果:
{
"user": "a",
"title": "aaa"
}
可悲的是,整个后一个对象被删除了。 如果你知道一些好的解决方案?
最直接的方法就是简单地删除出现不需要的密钥,例如:
map( if .title == null then del(.title) else . end)
使用walk/1
如果要全局执行此操作(即,无论 .title 为空的任何地方,无论对象出现在何处(:
walk(if type == "object" and .title == null then del(.title) else . end)
这可以使用通用函数进行一些整理,when/2
:
def when(p;q): if p? // false then q else . end;
现在我们可以简单地写:
walk( when(.title == null; del(.title)) )
应有尽有
def when(p;q): if p? // false then q else . end;
walk( when(type=="object"; with_entries( select(.value != null ))))
或者,使用基于Unix步行路径的Unix实用程序可以实现相同的要求jtc
:
bash $ JSN='[{"user":"a","title":"aaa"},{"user":"b","title":null}]'
bash $ <<<$JSN jtc -w'[title]:<>n:' -p
[
{
"title": "aaa",
"user": "a"
},
{
"user": "b"
}
]
bash $
这将删除所有(如果有多个(记录"title":null
如果需要删除所有null
值(不仅按title
限定范围(,则-w'<>n:'
要使用的步行路径
PS> 披露:我是用于 JSON 操作的 jtc
- shell cli 工具的创建者