Filtrando a solicitação JSON com o JQ e o script bash

2

Estou solicitando um JSON do Twitch com: curl --silent -H 'Accept: application/vnd.twitchtv.v3+json' -X GET https://api.twitch.tv/kraken/streams/$1 onde $1 é a entrada que envio para minha função.

Agora, o que eu pretendo é filtrar o JSON canalizando isso após o curl: | jq '.stream.channel.something' Eu estou tentando obter 3 valores diferentes de seqüência de caracteres por meio de filtragem jq Consigo conseguir obtê-los para este nível:

{
    "first": "lor"
    "second": "em"
    "third": "ipsum"
}

Maneira de operar com eles dentro do código?

Alternativas que eu tenho são:

  1. Crie a saída da curva, filtre e exclua.
  2. Enviar 3 solicitações cURL - (desempenho inútil)?
por confusedoverflow 12.02.2016 / 11:21

1 resposta

2

Como eu disse, não sei muito sobre json ou jq, mas não consegui fazer com que o jq analisasse sua saída de exemplo:

{
    "first": "lor"
    "second": "em"
    "third": "ipsum"
}

parse error: Expected separator between values at line 3, column 12

Então eu transformei a entrada em:

{
  "stream" : {
    "channel" : {
      "something" : {
        "first": "lor",
        "second": "em",
        "third": "ipsum"
      }
    }
  }
}

... com base no que eu recolhi da sua chamada para jq. Espero que seja semelhante ao que o comando curl está transmitindo.

Se for, então parece que esta sequência mostra o que você deseja:

# this is just your original curl command, wrapped in command substitution,
# in order to assign it to a variable named 'output':
output=$(curl --silent -H 'Accept: application/vnd.twitchtv.v3+json' -X GET https://api.twitch.tv/kraken/streams/$1)

# these three lines take the output stream from above and pipe it to
# separate jq calls to extract the values; I added some pretty-printing whitespace
first=$( echo "$output" | jq '.["stream"]["channel"]["something"]["first"]' )
second=$(echo "$output" | jq '.["stream"]["channel"]["something"]["second"]')
third=$( echo "$output" | jq '.["stream"]["channel"]["something"]["third"]' )

Com os resultados:

$ echo $first
"lor"
$ echo $second
"em"
$ echo $third
"ipsum"
    
por 19.02.2016 / 03:47

Tags