删除所有空值

Ela*_*Ela 4 bash null json jq

我试图使用jq从json对象中删除空值.我在他们的github上发现了这个问题,所以现在我正试图将它们删除del.我有这个:

'{ id: $customerId, name, phones: ([{ original: .phone }, 
 { original: .otherPhone}]), email} | del(. | nulls)'
Run Code Online (Sandbox Code Playgroud)

这似乎没有做任何事情.但是如果我更换nulls.phones它删除的电话号码.

kni*_*ttl 36

Michael Homerhttps://unix.stackexchange.com上的回答有一个超级简洁的解决方案,自 jq 1.6 起就有效:

\n
del(..|nulls)\n
Run Code Online (Sandbox Code Playgroud)\n

它会从 JSON 中删除所有空值属性(和值)。简单又甜蜜:)

\n

nulls是一个内置过滤器,可以用自定义选择替换:

\n
del(..|select(. == "value to delete"))\n
Run Code Online (Sandbox Code Playgroud)\n

要根据多个条件删除元素,例如删除所有布尔值和所有数字:

\n
del(..|booleans,numbers)\n
Run Code Online (Sandbox Code Playgroud)\n

或者,仅删除不匹配条件的节点:

\n
del(..|select(. == "value to keep" | not))\n
Run Code Online (Sandbox Code Playgroud)\n

(最后一个例子只是说明性的 \xe2\x80\x93 当然你可以交换==!=,但有时这是不可能的。例如保留所有真实值del(..|select(.|not)):)

\n

  • 链接答案下的评论建议对版本 1.5 使用 `jq 'del(recurse(.[]?;true)|select(.== null))'`,我成功地使用了它。 (2认同)

Cal*_*leb 8

迄今为止,这里的所有其他答案都是旧版本的解决方法jq,目前尚不清楚如何在最新发布的版本中简单地做到这一点。在 JQ 1.6 或更新版本中,这将完成递归删除空值的工作:

$ jq 'walk( if type == "object" then with_entries(select(.value != null)) else . end)' input.json
Run Code Online (Sandbox Code Playgroud)

源自有关上游讨论添加功能的问题的评论walk()


pea*_*eak 7

以下说明如何从JSON对象中删除所有空值键:

jq -n '{"a":1, "b": null, "c": null} | with_entries( select( .value != null ) )'
{
  "a": 1
}
Run Code Online (Sandbox Code Playgroud)

或者,paths/0可以使用如下:

. as $o | [paths[] | {(.) : ($o[.])} ] | add
Run Code Online (Sandbox Code Playgroud)

顺便说一句,del/1也可以用来实现相同的结果,例如使用这个过滤器:

reduce keys[] as $k (.; if .[$k] == null then del(.[$k]) else . end)
Run Code Online (Sandbox Code Playgroud)

或者不太明显,但更简洁:

del( .[ (keys - [paths[]])[] ] )
Run Code Online (Sandbox Code Playgroud)

为了记录,这里有两种使用方法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'
Run Code Online (Sandbox Code Playgroud)

在最后两种情况中,输出相同:{"a":1,"d":2}

  • 它是函数的数量。jq 的最新版本有一个名为“builtins”的内置函数,它发出 FUNCTOR/ARITY 形式的字符串数组 (3认同)