使用jq过滤空和/或null值

19

我有一个包含JSON行的文件,希望查找空值。

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

我希望输出空值和/或null值及其键:

available: ""
color: null

我认为应该像这样:cat myexample | jq '. | select(. == "")',但它没有起作用。


请编辑您的问题以展示所需输出结果。祝您好运。 - shellter
5个回答

16

这里的棘手之处在于以一种不带引号的方式发出键,并以引号显示空字符串。以下是一种使用jq的-r命令行选项的解决方案:

这里的难点在于以一种不带引号的方式输出键,同时要以引号的形式显示空字符串。以下是一个使用jq的-r命令行选项的解决方案:
to_entries[]
| select(.value | . == null or . == "")
| if .value == "" then .value |= "\"\(.)\"" else . end
| "\(.key): \(.value)"

一旦给定的输入以明显的方式被修改为有效的JSON格式,输出就会完全按照规定。


谢谢!已更正输入。我真的不太理解这里的逻辑。我们不能只过滤空值键吗?为什么要转换为条目然后选择条目,然后...真的不知道在那里发生了什么! - Fernando César
你可能会喜欢阅读jq教程和jq手册的相关章节--请参见[tag:jq]。 - peak
1
这些 to_entries[] 是什么意思,如何在 jq 中使用它? - VM47
1
@VM47 - 请参阅jq手册https://stedolan.github.io/jq/manual/ - peak

14

以下 jq 程序可能更有用,可用于识别具有 null 或空字符串值的键:

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

使用示例输入,此程序将生成:
{"available":""}
{"color":null}

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

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

8

jq -r '.firstName | select(.)' file.json - undefined

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)'
{}

1
你可以使用select(.)来过滤掉空值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接