我正在尝试使用 jq 从 json 对象中删除空值。我找到了 this issue在他们的 github 上,所以现在我试图用 del
删除它们。
我有这个:
'{ id: $customerId, name, phones: ([{ original: .phone },
{ original: .otherPhone}]), email} | del(. | nulls)'
这似乎没有做任何事情。但是,如果我将 nulls
替换为 .phones
,它会删除电话号码。
最佳答案
下面说明了如何从 JSON 对象中删除所有空值键:
jq -n '{"a":1, "b": null, "c": null} | with_entries( select( .value != null ) )'
{
"a": 1
}
或者,paths/0
可以按如下方式使用:
. as $o | [paths[] | {(.) : ($o[.])} ] | add
顺便说一下,del/1
也可以用来达到相同的结果,例如使用这个过滤器:
reduce keys[] as $k (.; if .[$k] == null then del(.[$k]) else . end)
或者不太明显,但更简洁:
del( .[ (keys - [paths[]])[] ] )
郑重声明,这里有两种使用 delpaths/1
的方法:
jq -n '{"a":1, "b": null, "c": null, "d":2} as $o
| $o
| delpaths( [ keys[] | select( $o[.] == null ) ] | map( [.]) )'
$ jq -n '{"a":1, "b": null, "c": null, "d":2}
| [delpaths((keys - paths) | map([.])) ] | add'
在后两种情况下,输出是相同的: { “一个”:1, “d”:2
作为引用,如果您想从 JSON 文本中的所有 JSON 对象中删除空值键(即,递归地),您可以使用 walk/1
,或者:
del(.. | objects | (to_entries[] | select(.value==null) | .key) as $k | .[$k])
关于json - 删除所有空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39500608/