Home > other >  Pass jq output to curl
Pass jq output to curl

Time:02-10

I want to be use a number of values from jq piped to curl. I have json data with a structure that looks something like this

{
  "apps": {
    "code": "200",
    "name": "app1",
  },
  "result": "1"
}
{
  "apps": {
    "code": "200",
    "name": "app2",
  },
  "result": "5"
}
...
...
...

What I want to do is to take the values of every apps.name and result and pass that to curl:

curl -XPOST http://localhost --data-raw 'app=$appsName result=$result'

The curl command will then run X amount of times depending on how many objects there are. In jq I came up with this but I don't know how or the best way of passing this to curl in a loop.

jq -r '.result as $result | .apps as $apps | $apps.name   " "   $result myfile.json

CodePudding user response:

Maybe something like this?

jq < data.json '[.apps.name, .result]|@tsv' -r | while read appsName result; do
    curl -XPOST http://localhost --data-raw "$appsName $result"
done

CodePudding user response:

jq -r '"\( .apps.name ) \( .result )"' |
while read -r app result; do
   curl -XPOST http://localhost --data-raw "app=$app result=$result"
done

or

jq -r '"app=\( .apps.name ) result=\( .result )"' |
while read -r data; do
   curl -XPOST http://localhost --data-raw "$data"
done

The first one assumes the name can't contain whitespace.

CodePudding user response:

Would this do it?

while read -r line; do
  curl -XPOST http://localhost --data-raw "$line"
done < <(jq -r '"app=\(.apps.name) result=\(.result)"' myfile.json)

CodePudding user response:

I think xargs is better than while loops. Maybe just personal preference.

jq -r '"app=\( .apps.name ) result=\( .result )"' \
  | xargs -r -I{} curl -XPOST http://localhost --data-raw "{}"
  • Related