kni*_*ttl 36
Michael Homer在https://unix.stackexchange.com上的回答有一个超级简洁的解决方案,自 jq 1.6 起就有效:
\ndel(..|nulls)\nRun Code Online (Sandbox Code Playgroud)\n它会从 JSON 中删除所有空值属性(和值)。简单又甜蜜:)
\nnulls是一个内置过滤器,可以用自定义选择替换:
del(..|select(. == "value to delete"))\nRun Code Online (Sandbox Code Playgroud)\n要根据多个条件删除元素,例如删除所有布尔值和所有数字:
\ndel(..|booleans,numbers)\nRun Code Online (Sandbox Code Playgroud)\n或者,仅删除不匹配条件的节点:
\ndel(..|select(. == "value to keep" | not))\nRun Code Online (Sandbox Code Playgroud)\n(最后一个例子只是说明性的 \xe2\x80\x93 当然你可以交换==为!=,但有时这是不可能的。例如保留所有真实值del(..|select(.|not)):)
迄今为止,这里的所有其他答案都是旧版本的解决方法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()。
以下说明如何从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}
| 归档时间: |
|
| 查看次数: |
5199 次 |
| 最近记录: |