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

问题描述 投票:0回答:5

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

{"name": "Color TV", "price": "1200", "available": ""}
{"name": "DVD player", "price": "200", "color": null}

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

available: ""
color: null

我认为它应该是类似

cat myexample | jq '. | select(. == "")'
的东西,但不起作用。

json null jq key-value jsonlines
5个回答
15
投票

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

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

一旦以明显的方式修改给定的输入以使其有效 JSON,输出将与指定的完全一致。


13
投票

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

with_entries(select(.value |.==null or . == ""))

使用示例输入,该程序将生成:

{"available":""}
{"color":null}

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

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

5
投票

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

jq -r '.firstName | select( . != null )' file.json

2
投票

使用单个

with_entries(if .value == null or .value == "" then empty else . end)
过滤器表达式,可以过滤掉
null
和空 (
""
) 值。

未过滤:

echo '{"foo": null, "bar": ""}' | jq '.'
{
  "foo": null,
  "bar": ""
}

带过滤:

echo '{"foo": null, "bar": ""}' |  jq 'with_entries(if .value == null or .value == "" then empty else . end)'
{}

0
投票

您可以使用

select(.)
过滤掉空值

© www.soinside.com 2019 - 2024. All rights reserved.