我想知道如何将服务器的CURL JSON输出解析为变量。
目前,我有 -
curl -X POST -H "Content: agent-type: application/x-www-form-urlencoded" https://www.toontownrewritten.com/api/login?format=json -d username="$USERNAME" -d password="$PASSWORD" | python -m json.tool
但它只从服务器输出JSON,然后解析它,如下所示:
{
"eta": "0",
"position": "0",
"queueToken": "6bee9e85-343f-41c7-a4d3-156f901da615",
"success": "delayed"
}
但是我如何把 - 例如上面的成功值从服务器返回到变量$ SUCCESS并且值为delayed&将queueToken作为变量$ queueToken和6bee9e85-343f-41c7-a4d3-156f901da615作为值?
然后当我使用 -
echo "$SUCCESS"
它将此显示为输出 -
delayed
当我使用
echo "$queueToken"
,输出为
6bee9e85-343f-41c7-a4d3-156f901da615
谢谢!
答案 0 :(得分:2)
查找并安装jq
(https://stedolan.github.io/jq/)。 jq
是一个JSON解析器。面向行的工具(如sed
)无法可靠地解析JSON,因为与XML一样,JSON不是面向行的数据格式。
就你的问题而言:
source <(
curl -X POST -H "$content_type" "$url" -d username="$USERNAME" -d password="$PASSWORD" |
jq -r '. as $h | keys | map(. + "=\"" + $h[.] + "\"") | .[]'
)
jq
语法有点奇怪,我还在努力。它基本上是一系列过滤器,每个管道都采用先前的输入并对其进行转换。在这种情况下,最终结果是一些看起来像variable="value"
这个答案使用bash的“进程替换”来获取jq
命令的结果,将其视为文件,并将source
放入当前shell。然后可以使用这些变量。
答案 1 :(得分:0)
以下是Extract a JSON value from a BASH script
的示例#!/bin/bash
function jsonval {
temp=`echo $json | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w $prop`
echo ${temp##*|}
}
json=`curl -s -X GET http://twitter.com/users/show/$1.json`
prop='profile_image_url'
picurl=`jsonval`
`curl -s -X GET $picurl -o $1.png`
一个bash脚本,演示解析JSON字符串以提取 适当的价值。该脚本包含一个运行的jsonval函数 关于两个变量,json和prop。当脚本传递名称时 Twitter用户尝试下载用户的个人资料图片。
答案 2 :(得分:0)
您可以在命令行上使用perl模块:
1,确保它们已经安装,在debian的基础上,你可以
sudo apt-get install libjson-xs-perl
但对于其他操作系统,您可以通过CPAN (the Comprehensive Perl Archive Network)安装perl模块:
cpan App::cpanminus
cpan JSON::XS
注意:您可能必须以超级用户权限运行它。
然后:
curlopts=(-X POST -H
"Content: apent-type: application/x-www-form-urlencoded"
-d username="$USERNAME" -d password="$PASSWORD")
curlurl=https://www.toontownrewritten.com/api/login?format=json
. <(
perl -MJSON::XS -e '
$/=undef;my $a=JSON::XS::decode_json <> ;
printf "declare -A Json=\047(%s)\047\n", join " ",map {
"[".$_."]=\"".$a->{$_}."\""
} qw|queueToken success eta position|;
' < <(
curl "${curlopts[@]}" $curlurl
)
)
行qw|...|
可以让您精确地确定要驱动哪些变量...这可以由keys $a
替换,但可能需要调试,因为某些字符是forbiden是关联的数组值名称。
echo ${Json[queueToken]}
6bee9e85-343f-41c7-a4d3-156f901da615
echo ${Json[eta]}
0