使用 jq 过滤空值和/或空值

Fer*_*sar 5 null json key-value jq jsonlines

我有一个带有 jsonlines 的文件,想找到空值。

{"name": "Color TV", "price": "1200", "available": ""}
{"name": "DVD player", "price": "200", "color": null}
Run Code Online (Sandbox Code Playgroud)

并想输出空和/或空值及其键:

available: ""
color: null
Run Code Online (Sandbox Code Playgroud)

我认为它应该类似于cat myexample | jq '. | select(. == "")',但不起作用。

pea*_*eak 14

有些人可能会发现以下 jq 程序对于识别具有 null 或空字符串值的键更有用:

with_entries(select(.value |.==null or . == ""))
Run Code Online (Sandbox Code Playgroud)

通过示例输入,该程序将生成:

{"available":""}
{"color":null}
Run Code Online (Sandbox Code Playgroud)

添加更多信息,例如输入行或对象编号,也很有意义,例如:

with_entries(select(.value |.==null or . == ""))
| select(length>0)
| {n: input_line_number} + .
Run Code Online (Sandbox Code Playgroud)


Mar*_*oll 11

看看这个片段https://blog.nem.ec/code-snippets/jq-ignore-nulls/

jq -r '.firstName | select( . != null )' file.json
Run Code Online (Sandbox Code Playgroud)


pea*_*eak 7

这里棘手的部分是以空字符串显示带引号的方式发出不带引号的键。这是一种适用于 jq 的 -r 命令行选项的解决方案:

to_entries[]
| select(.value | . == null or . == "")
| if .value == "" then .value |= "\"\(.)\"" else . end
| "\(.key): \(.value)"
Run Code Online (Sandbox Code Playgroud)

一旦以明显的方式修改了给定的输入以使其成为有效的 JSON,输出就完全符合指定的要求。