使用 jq 将 json 转换为 csv 时处理 null(空数组)?

使用 jq 将 json 转换为 csv 时处理 null(空数组)?

当尝试将 json 转换为 csv 时,我收到有关 null 的错误,查询如下jq

printf "[]" | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'

它给出以下错误,

jq: error (at <stdin>:0): Cannot iterate over null (null)

但如果 json 数组非空并且其中有一个对象,则工作正常:

$ printf '[{"a":1}]' | jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'
"a"
1

语法jq看起来不错,但我不太熟悉,因为我刚刚开始使用这个工具。

有人可以解释一下如何修补查询以在数组为空时不输出任何内容吗? (第一个例子)。

答案1

您可以使用错误抑制/可选运算符:?阻止空数组调用并返回,而不向控制台抛出任何错误,如下所示

printf '[]' | jq -r '.? |(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'

where也可以使用catch 块 as.?显式编写,并让过滤器的其余部分跟随在其后面。如果表达式失败,则跳过可选运算符之后的过滤器部分。trytry .?

相关内容