Search code examples
jsonlinuxbashshellwget

How to parse json response in the shell script?


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?


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.