How to parse json response in the shell script?

bash, json, linux, shell, wget

Solution

#!/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` expands backslash escape sequences in the corresponding argument.

Update as I didn't really get the question at first. It should simply be:

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

And you can examine it further:

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

Of course similar obvious tests can be done with it:

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

From your last comment it can be simply done as

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.

Problem

I am working with bash shell script. I need to execute an URL using shell script and then parse the json data coming from it. This is my URL - `http://localhost:8080/test_beat` and the responses I can get after hitting the URL will be from either these two - ``` {"error": "error_message"} {"success": "success_message"} ``` Below is my shell script which executes the URL using wget. ``` #!/bin/bash DATA=$(wget -O - -q -t 1 http://localhost:8080/test_beat) #grep $DATA for error and success key ``` Now I am not sure how to parse json response in $DATA and see whether the key is success or error. If the key is success, then I will print a message "success" and print $DATA value and exit out of the shell script with zero status code but if the key is error, then I will print "error" and print $DATA value and exit out of the shell script with non zero status code. How can I parse json response and extract the key from it in shell script? I don't want to install any library to do this since my JSON response is fixed and it will always be same as shown above so any simpler way is fine. Update:- Below is my final shell script - ``` #!/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 ``` Does this looks right?

Original source