如何检查jq结果是否为空?

Ram*_*man 5 bash shell null json jq

我正在使用 jq 来解析一些 JSON。我想检查一个属性是否存在。如果它存在,我总是想获取数组中的第一个元素。基于此,我想使用if then ... else.

我的代码如下所示:

JSON_INPUT='{"var1":[{"foo":"bar"}],"var2":[{"fooooo":"baaaaar"}]}'
VAR2=$(echo $JSON_INPUT | jq  '.["var2"] | .[0]')
if [ -z "${VAR2}" ]
then
    echo "does not exist"
    # do some stuff...
else
    echo "exist"
    # do some stuff...
fi
Run Code Online (Sandbox Code Playgroud)

JSON_INPUT 可以包含var2但不能包含。如果不存在VAR2则为空。但我无法检查这个空值。错误在哪里?

Cyr*_*rus 6

错误在哪里?

代替

[ -z "${VAR2}" ]
Run Code Online (Sandbox Code Playgroud)

[ "${VAR2}" = "null" ]
Run Code Online (Sandbox Code Playgroud)

因为如果在 JSON 文件中找不到,则jq返回字符串。nullvar2


或使用--exit-status

if echo "$JSON_INPUT" | jq --exit-status '.var2' >/dev/null; then 
  echo "exists"
else
  echo "does not exist"
fi
Run Code Online (Sandbox Code Playgroud)


pea*_*eak 5

我想检查一个属性是否存在。如果它存在,我总是想获取数组中的第一个元素......

该条件最好可以表示为:

if has("var2")
Run Code Online (Sandbox Code Playgroud)

因此,由于您似乎希望在不满足条件时 VAR2 为空,因此您可以编写:

VAR2=$(jq 'if has("var2") then .["var2"][0] else null end')
Run Code Online (Sandbox Code Playgroud)

如果不满足条件,我们会发现:

echo "$VAR2"
null
Run Code Online (Sandbox Code Playgroud)

不过,这里有一个小问题:例如,如果数组的第一个值是怎么办null

因此,更具区别性的方法是编写:

 VAR2=$(jq 'if has("var2") then .["var2"][0] else empty end')
Run Code Online (Sandbox Code Playgroud)

即使这两种方法都不是您想要的,它们也表明,将尽可能多的逻辑放入 jq 程序中会产生一个整洁、易于理解且高效的解决方案。