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

bybem2ql  于 2023-01-27  发布在  其他
关注(0)|答案(4)|浏览(284)

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

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

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

available: ""
color: null

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

oogrdqng

oogrdqng1#

这里比较棘手的部分是发出不带引号的键,而空字符串用引号显示,这里有一个使用jq的-r命令行选项的解决方案:

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

一旦给定的输入以显而易见的方式被修改为有效的JSON,输出就与指定的完全相同。

uwopmtnx

uwopmtnx2#

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

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

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

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

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

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

unhi4e5o3#

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

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

带过滤:

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

mf98qq944#

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

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

相关问题