json - 删除所有空值

标签 json bash null jq

我正在尝试使用 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/

相关文章:

c# - 组合来自不同 URL 的 2 个 JSON 源

php - 使用 json 解码获取一些数据

ios - curl 和 URLSession 返回不同的数据

Python 脚本在 bash 中运行,但不在 cron 中运行?

scala - 将元组与null匹配

json - 如何序列化以在 F# 上使用 JSON.NET 进行流式传输?

java - [简单类型,反序列化时重复属性 ''

linux - tar 排除不起作用

kotlin - 如何在单个表达式中检查一组函数是否全部返回非 null?

mysql - 检查 MySQL 中的 JSON 值是否为空?