如何使用 bash 使用 jq 过滤 json 文件

How filter json file with jq using bash

我正在尝试使用 bash 过滤我的 json 文件,该文件可能类似于:

{
    "key1": [],
    "key2":["first_value","second_value"]
}

如果我想获取我得到的 key1 和 key2,我可以这样做:

if $(cat $my_json | jq 'has("key1")'); then
  values=$(jq -r ".key1" "$my_json")

  for item in $values
  do
    echo "Item : $item"
  done
fi

前面的输出是:

Output:

Item : []

如果我的文件没有这样的密钥并且我想验证这一点,这可以防止出现任何问题。

参考我的示例,如何验证值是否为空?
我想避免对空值进行任何迭代。
有什么方法可以用jq验证现有的密钥,它不应该是空的?

我想实现的目标是 redirected at the end of a file

key2:
- first_value
- second_value

如果是key,因为它是空的我不想有任何结果

一个选项可能是使用

jq '.| select( has("key1"))|to_entries[] | select( .value | length == 0 )' $my_json

Demo

Edit(after question's edit): 如果你需要获取不同于前一个数组的 non-empty 数组的值,那么只需将上面的过滤器转换为

jq -r '.......| length > 0) | "\(.key):", "- \(.value[])"' $my_json

通过使用字符串插值

Demo

在 jq 中,您可以使用 length 过滤器来获取数组的大小。

$ echo '{"key1": [], "key2":["1","2"]}' | jq -r ".key2 | length"
2
$ echo '{"key1": [], "key2":["1","2"]}' | jq -r ".key1 | length"
0

此外,即便如此,您也会发现迭代存储在 $values 中的数组元素时出现问题。我想你想要的是这个:

values=$(jq -r ".key1[]" "$my_json")

这会丢弃所有具有空数组的项目,并迭代其余部分打印出键名,然后是所有数组项目。

jq -r 'to_entries[] | select(.value | length > 0) | .key, "- \(.value[])"'
key2
- first_value
- second_value

Demo