Shell脚本CURL JSON值为变量

时间:2015-05-03 20:54:44

标签: json macos shell curl

我想知道如何将服务器的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

谢谢!

3 个答案:

答案 0 :(得分:2)

查找并安装jqhttps://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