Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Shell Script CURL JSON value to variable

I was wondering how to parse the CURL JSON output from the server into variables.

Currently, I have -

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

But it only outputs the JSON from the server and then have it parsed, like so:

{
    "eta": "0",
    "position": "0",
    "queueToken": "6bee9e85-343f-41c7-a4d3-156f901da615",
    "success": "delayed"
}

But how do I put - for example the success value above returned from the server into a variable $SUCCESS and have the value as delayed & have queueToken as a variable $queueToken and 6bee9e85-343f-41c7-a4d3-156f901da615 as a value?



Then when I use-

echo "$SUCCESS"

it shows this as the output -

delayed



And when I use

echo "$queueToken"

and the output as

6bee9e85-343f-41c7-a4d3-156f901da615

Thanks!

like image 869
EndenDragon Avatar asked Oct 18 '25 15:10

EndenDragon


2 Answers

Find and install jq (https://stedolan.github.io/jq/). jq is a JSON parser. JSON is not reliably parsed by line-oriented tools like sed because, like XML, JSON is not a line-oriented data format.

In terms of your question:

source <(
    curl -X POST -H "$content_type" "$url" -d username="$USERNAME" -d password="$PASSWORD" | 
    jq -r '. as $h | keys | map(. + "=\"" + $h[.] + "\"") | .[]'
)

The jq syntax is a bit weird, I'm still working on it. It's basically a series of filters, each pipe taking the previous input and transforming it. In this case, the end result is some lines that look like variable="value"

This answer uses bash's "process substitution" to take the results of the jq command, treat it like a file, and source it into the current shell. The variables will then be available to use.

like image 86
glenn jackman Avatar answered Oct 20 '25 05:10

glenn jackman


Here's an example of 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`

A bash script which demonstrates parsing a JSON string to extract a property value. The script contains a jsonval function which operates on two variables, json and prop. When the script is passed the name of a twitter user it attempts to download the user's profile picture.

like image 32
Pedro Lobito Avatar answered Oct 20 '25 05:10

Pedro Lobito



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!