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

tin*_*lyx 3 ubuntu csv json jq

尝试将 json 转换为 csv 时,我通过以下jq查询收到有关 null 的错误:

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

它给出了以下错误,

jq: error (at <stdin>:0): Cannot iterate over null (null)
Run Code Online (Sandbox Code Playgroud)

但如果 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
Run Code Online (Sandbox Code Playgroud)

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

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

Ini*_*ian 5

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

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

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