繁体   English   中英

如何解析shell脚本中的json响应?

[英]How to parse json response in the shell script?

我正在使用bash shell脚本。 我需要使用shell脚本执行URL,然后解析来自它的json数据。

这是我的URL - http://localhost:8080/test_beat ,点击URL后我可以得到的响应来自这两个 -

{"error": "error_message"}
{"success": "success_message"}

下面是我的shell脚本,它使用wget执行URL。

#!/bin/bash

DATA=$(wget -O - -q -t 1 http://localhost:8080/test_beat)
#grep $DATA for error and success key

现在我不知道如何解析$ DATA中的json响应,看看密钥是成功还是错误。 如果密钥成功,那么我将打印一条消息“success”并打印$ DATA值并退出shell脚本,状态代码为零,但如果密钥错误,那么我将打印“error”并打印$ DATA值并使用非零状态代码退出shell脚本。

如何解析json响应并从shell脚本中提取密钥?

我不想安装任何库来执行此操作,因为我的JSON响应已修复,并且它将始终与上面显示的相同,因此任何更简单的方法都可以。

更新: -

下面是我的最终shell脚本 -

#!/bin/bash

DATA=$(wget -O - -q -t 1 http://localhost:8080/tester)
echo $DATA
#grep $DATA for error and success key
IFS=\" read __ KEY __ MESSAGE __ <<< "$DATA"
case "$KEY" in
success)
    exit 0
    ;;
error)
    exit 1
    ;;
esac    

这看起来不错吗?

如果你打算从shell中使用任何更复杂的json,你可以安装其他软件, jq将成为你的朋友。

因此,例如,如果您只想提取错误消息(如果存在),那么您可以这样做:

$ echo '{"error": "Some Error"}' | jq ".error"
"Some Error"

如果您在成功案例中尝试此操作,它将执行以下操作:

$echo '{"success": "Yay"}' | jq ".error"
null

该工具的主要优点是它完全理解json。 所以,不需要关注角落案件等等。

#!/bin/bash
IFS= read -d '' DATA < temp.txt  ## Imitates your DATA=$(wget ...). Just replace it.
while IFS=\" read -ra LINE; do
    case "${LINE[1]}" in
    error)
        # ERROR_MSG=${LINE[3]}
        printf -v ERROR_MSG '%b' "${LINE[3]}"
        ;;
    success)
        # SUCCESS_MSG=${LINE[3]}
        printf -v SUCCESS_MSG '%b' "${LINE[3]}"
        ;;
    esac
done <<< "$DATA"
echo "$ERROR_MSG|$SUCCESS_MSG"  ## Shows: error_message|success_message

* %b在相应的参数中展开反斜杠转义序列。


更新,因为我最初没有真正得到问题。 它应该只是:

IFS=\" read __ KEY __ MESSAGE __ <<< "$DATA"
[[ $KEY == success ]]  ## Gives $? = 0 if true or else 1 if false.

你可以进一步检查它:

case "$KEY" in
success)
    echo "Success message: $MESSAGE"
    exit 0
    ;;
error)
    echo "Error message: $MESSAGE"
    exit 1
    ;;
esac

当然可以用它做类似的明显测试:

if [[ $KEY == success ]]; then
    echo "It was successful."
else
    echo "It wasn't."
fi

从您上次的评论中可以简单地完成

IFS=\" read __ KEY __ MESSAGE __ <<< "$DATA"
echo "$DATA"  ## Your really need to show $DATA and not $MESSAGE right?
[[ $KEY == success ]]
exit  ## Exits with code based from current $?. Not necessary if you're on the last line of the script.

您可能已经安装了python,它在标准库中进行了json解析。 Python不是shell脚本中单行的优秀语言,但这是一种使用它的方法:

#!/bin/bash

DATA=$(wget -O - -q -t 1 http://localhost:8080/test_beat)

if python -c '
import json, sys
exit(1 if "error" in json.loads(sys.stdin.read()) else 0)' <<<"$DATA"
then
  echo "SUCCESS: $DATA"
else
  echo "ERROR: $DATA"
  exit 1
fi

鉴于:

  • 您不想使用JSON库。
  • 并且您正在解析的响应很简单,您唯一关心的是子串"success"的存在,我建议以下简化
#!/bin/bash

wget -O - -q -t 1 http://localhost:8080/tester | grep -F -q '"success"'
exit $?
  • -F告诉grep搜索固定(文字)字符串。
  • -q告诉grep不产生输出,而只是通过其退出代码反映是否找到匹配。
  • exit $? 只需退出grep的退出代码( $?是一个反映最近执行的命令的退出代码的特殊变量)。

请注意,如果你关心的是wget的输出是否包含"success" ,那么上面的管道就可以了 - 不需要在aux中捕获wget的输出。 变量。

暂无
暂无

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

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