jq & bash: faire tableau JSON à partir d'une variable
Je suis en utilisant jq pour former un JSON dans le bash à partir des valeurs de variables.
Obtenu de la façon de faire de la plaine des variables
$ VAR="one two three"
$ jq -n "{var:\"$VAR\"}"
{
"var": "one two three"
}
Mais ne peut pas faire des tableaux encore. J'ai
$ echo $ARR
one
two
three
et que vous voulez obtenir quelque chose comme
{
"arr": ["one", "two", "three"]
}
J'ai seulement réussi à obtenir la sortie tronquée comme
$ jq -n "{arr: [\"$ARR\"]}"
{
"arr": [
"one\ntwo\nthree"
]
}
Comment forme de tableau JSON dans une manière correcte? Peut jq
jamais le faire?
MODIFIER: Question a été posée quand il n'y avait qu'jq 1.3. Maintenant, dans jq 1.4, il est possible de le faire directement ce que j'ai demandé, comme @JeffMercado et @pic suggéré, upvote pour eux. Ne pas annuler l'acceptation de @jbr 's réponse.
OriginalL'auteur Andrey Regentov | 2014-03-16
Vous devez vous connecter pour publier un commentaire.
jq
est en train de faire exactement ce que vous lui dites de faire.Donc si vous le voulez imprimer un objet avec un tableau contenant "un", "deux", "trois", alors vous avez de la générer.jq
n'est pas un programme pour générer du JSON, mais un outil pour l'interrogation. Ce que vous faites avec le-n
commutateur est juste de l'utiliser comme une jolie imprimante.Mise à jour
Comme Bryan et d'autres mentionnent ci-dessous, il est en effet possible de générer du JSON avec jq, et à partir de la version 1.4, il est même possible de faire ce que l'OP demander directement, voir par exemple Jeff répondre.
jq
comme le formatage automatique de la requêteQui ne fonctionne qu'avec gnu
sed
. Je suggère de remplacer la deuxième ligne avecVAR=$(printf '"%s"\n' $VAR|paste -sd, -)
.jq est un fabuleux moyen de générer du JSON, surtout si vous avez toute sorte de caractères spéciaux (comme ") dans les valeurs que vous souhaitez écrire dans le JSON
Comme Bryan Larsen a écrit, jq est un excellent choix pour générer du JSON, comme illustré dans certaines des réponses ci-dessous. Quelqu'un pourrait-il supprimer les informations erronées dans le post ci-dessus, et/ou bas-vote (comme il ne répond pas à la question)?
pour votre commentaire. Qui était important, étant donné que la commande enveloppe l'ensemble de la chaîne comme une variable. I. e. Origine de la ligne de commande - tous mes fichiers ont été brisées répertorié en tant que nom de fichier ET l'extension individuellement comme indiqué:
{ files:["filename".,"mp4","filename2".,"mp4"]}
. La méthode correcte (votre suggestion) ont montré que{ files: ["filename.mp4","filename2.mp4"]}
. Je vous remercie.OriginalL'auteur jbr
Dans jq 1.3 et vous pouvez utiliser le
--arg VARIABLE VALUE
option de ligne de commande:I. e.,
--arg
définit une variable à la valeur donnée de sorte que vous pouvez ensuite utiliser$varname
dans votre jq programme, et maintenant vous n'avez pas à utiliser le shell interpolation de variable dans votre jq programme.EDIT: a Partir de jq 1.5 et le haut, vous pouvez utiliser l'option --argjson pour passer un tableau directement, par exemple
Avez-vous l'essayer? Utilisez simplement
'[$v]'
à la place.probablement pas. Si jq est la lecture de la environnement, puis, une variable doit être Exportés (en bash) pour être visible, et les demandes d'exportation de tableaux sont ignorées silencieusement. La voie pour un programme appelé par bash de "recevoir" le contenu d'un tableau serait à l'exprimer comme une chaîne de caractères, avec des séparateurs de champ. Vous pouvez essayer de
jq -n --argjson v "[$(printf '"%s",' "${arr[@]}")0]" '{"foo": $v}'
, ce qui ne laisse que peu de déchets dans le tableau, et échoue si le tableau de données contient des guillemets.OriginalL'auteur user2259432
Une fois que vous avez votre variable chargé, vous devez utiliser le
split
filtre à briser cette chaîne en un tableau.cette chaîne a commencé à travailler pour moi, quand j'ai écrit
--arg ARR "$ARR"
au lieu de--arg ARR $ARR
.OriginalL'auteur Jeff Mercado
L'original poster dans ce thread mentionne VAR="un deux trois". Pour une telle variable, une solution très simple dans jq 1.4 est comme suit:
(Ce qui suppose un Linux ou Mac shell ou similaire, et travaille avec jq 1.4.)
Si le caractère de séparation est un retour à la ligne, à envisager ce tapuscrit:
Avis que la chaîne JSON pour le caractère de saut de ligne est
"\n"
(pas"\\n"
).Un troisième cas d'intérêt, c'est quand la VAR est un tableau bash. Dans ce cas, il peut être acceptable de passer dans les éléments à l'aide de "${VAR[@]}", mais en général, il convient de rappeler que le "--arg nom de la valeur" option est destinée uniquement pour le passage dans les chaînes.
Dans jq>1.4, exporté shell variables peuvent être transmises en utilisant le "env" objet, tel que documenté dans la ligne jq page de manuel.
OriginalL'auteur peak
Vous devez d'abord utiliser
-R
à lire les premières lignes et ensuite, vous avez à siphonner toutes les valeurs avec-s
:OriginalL'auteur ceving
Vous pouvez utiliser cette syntaxe:
pour l'entrée de données comme
pour obtenir analysé les données de JSON avec des variables.
Cet exemple affichera:
OriginalL'auteur alexglue