jquery jq命令检查JSON数组响应是否具有特定的用户名和状态,如使用shell脚本批准的

de90aj5v  于 2023-05-22  发布在  jQuery
关注(0)|答案(2)|浏览(105)

我下面有一个JSON数组响应

[
    {
        "user": {
            "login": "TOM",
        },
        "body": "",
        "state": "APPROVED",
    },
    {
        "user": {
            "login": "JERRY",
        },
        "body": "",
        "state": "APPROVED",
    },
    {
        "user": {
            "login": "ANDY",
        },
        "body": "",
        "state": "REJECTED",
    }
]

我正在编写代码来检查是否只有当用户Jerry存在并且状态为APPROVED时,我才应该将变量值设置为true,否则它应该为false。
在上面的情况下,我应该得到真,在下面的情况下,它应该是假的

[
    {
        "user": {
            "login": "TOM",
        },
        "body": "",
        "state": "APPROVED",
    },
    {
        "user": {
            "login": "JERRY",
        },
        "body": "",
        "state": "REJECTED",
    },
    {
        "user": {
            "login": "ANDY",
        },
        "body": "",
        "state": "REJECTED",
    }
]

[
    {
        "user": {
            "login": "TOM",
        },
        "body": "",
        "state": "APPROVED",
    },
    {
        "user": {
            "login": "ANDY",
        },
        "body": "",
        "state": "REJECTED",
    }
]

我试过下面的代码,但我无法解决这两个条件

hasJerry = false
if [ (jq -r '.[].user.login | index("JTHOM949")') && (jq -r '.[].state' == "APPROVED") ]; then

    hasJerry = true

fi

谁能帮我修改一下这个脚本。

csbfibhn

csbfibhn1#

你可以让jq输出truefalse,这样就可以直接设置变量。在jq中,您可以使用any来查找“至少一个项目”符合您的条件。

hasJerry="$(jq 'any(.user.login == "JERRY" and .state == "APPROVED")' input.json)"

Demo
请注意,您的Bash脚本有错误(例如:=周围的空格和变量赋值),以及您的(示例)JSON输入(例如对象中最后一个字段后的逗号)。请先更正。

wydwbb8l

wydwbb8l2#

您可以测试返回状态,而不是返回原始的True或False字符串:

#!/usr/bin/env sh

user=$1

while [ -z "$user" ]; do
  printf 'Enter user: ' 
  read -r user
  printf \\n
done

if jq -e --arg user "$user" \
  '
.users | 
any(
  .user.login == ($user | ascii_upcase) and
  .state == "APPROVED"
)
' input.json > /dev/null
then
  printf '%s is approved!\n' "$user"
else
  printf 'Non-aproved user %s!\n' "$user"
fi

相关问题