it-swarm.com.de

Kann ich eine String-Variable an jq übergeben, nicht an die Datei?

Ich möchte den JSON-String in ein Array in bash ..__ konvertieren. Der JSON-String wird als Argument an das Bash-Skript übergeben (es existiert nicht in einer Datei).

Gibt es eine Möglichkeit, dies zu erreichen, ohne einige temporäre Dateien zu verwenden?

Ähnlich dazu:

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

Ich würde vorschlagen, eine bash hier string zu verwenden. z.B.

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

Der Wert der Variablen "json_data", die in der ursprünglichen Frage angegeben wurde, war kein gültiger JSON-Wert, daher deckt diese Antwort immer noch beide Fälle ab (nahezu gültiger und gültiger JSON-Code).

Gültiges JSON

Wenn "$ json_data" einen gültigen JSON-Wert enthält, sind hier zwei Alternativen, die an anderer Stelle auf dieser Seite nicht aufgeführt sind.

--argjson

Zum Beispiel:

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

env

Wenn die Shell-Variable nicht bereits eine Umgebungsvariable ist:

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

Fast gültiger JSON

Wenn $ json_data tatsächlich als JSON invalid aber als jq-Ausdruck gültig ist, können Sie die Taktik anwenden, die durch das folgende Transkript veranschaulicht wird:

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

Verwenden Sie die Bash: echo "$json_data" | jq '.key'

4
Javier

Absolut. Einfach bash anweisen, stattdessen eine Datei zu geben.

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

Und stellen Sie sicher, dass Sie es in Bash ausführen, nicht in sh.

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

Wenn Sie versuchen, dies in einer .sh-Datei durchzuführen, funktionierte dies für mich:

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