web-dev-qa-db-fra.com

Puis-je passer une variable de chaîne à jq pas le fichier?

Je souhaite convertir une chaîne JSON en tableau dans bash . La chaîne JSON est transmise au script bash en tant qu'argument (elle n'existe pas dans un fichier).

Existe-t-il un moyen d'y parvenir sans utiliser certains fichiers temporaires?

De même à ceci:

script.sh

#! /bin/bash
json_data='{"key":"value"}'
jq '.key' $json_data

jq: error: Could not open file {key:value}: No such file or directory
8
Matt R

Je suggère d'utiliser une bash ici une chaîne . par exemple.

jq '.key' <<< "$json_data"
21
jq170727

La valeur de la variable "json_data" donnée dans la question initiale n'était pas un JSON valide. Cette réponse couvre donc toujours les deux cas (JSON presque valide et valide).

JSON valide

Si "$ json_data" contient une valeur JSON valide, voici deux alternatives non mentionnées ailleurs sur cette page.

--argjson

Par exemple:

 jq -n --argjson data "$json_data" '$data.key'

env

Si la variable Shell n'est pas déjà une variable d'environnement:

json_data=“$json_data” jq -n 'env.json_data | fromjson.key'

JSON presque valide

Si effectivement $ json_data est invalid comme JSON mais valide en tant qu’expression jq, vous pouvez adopter la tactique illustrée par la transcription suivante:

$ json_data='{key:"value"}'
$ jq -n "$json_data" | jq .key
"value"
7
peak

Utilisez le bash: echo "$json_data" | jq '.key'

4
Javier

Absolument. Il suffit de dire à bash de lui donner un fichier .

jq '.key' <(echo "$json_data")

Et assurez-vous de le lancer en bash, pas sh.

#! /bin/bash
json_data='{"key":"value"}'
echo $json_data | jq --raw-output '.key'
1
Supun Madushanka

Si vous essayez de faire cela dans un fichier .sh, voici ce qui a fonctionné pour moi:

local json_data $(getJiraIssue "$1")               # store JSON in var
echo `jq -n "$json_data" | jq '.fields.summary'`   # pass that JSON var to jq
0
DelightedD0D