繁体   English   中英

如何使用 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是:

Output:

Item : []

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

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

我想实现的目标是在文件末尾重定向

key2:
- first_value
- second_value

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

一种选择可能是使用

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

演示

编辑(问题编辑后):如果您需要获取与前一个不同的非空 arrays 的值,则只需将上述过滤器转换为

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

通过使用字符串插值

演示

这会丢弃所有具有空数组的项,并遍历 rest 打印出键名,然后是所有数组项。

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

演示

在 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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM