Comment vérifier si un élément existe dans la gamme avec jq
J'ai un tableau et j'ai besoin de vérifier si les éléments de cette matrice ou pour obtenir de l'élément du tableau à l'aide de
jq, de fruits.json:
{
"fruit": [
"apple",
"orange",
"pomegranate",
"apricot",
"mango"
]
}
cat fruit.json | jq '.fruit .apple'
ne fonctionne pas
OriginalL'auteur idmitriev | 2017-04-06
Vous devez vous connecter pour publier un commentaire.
La sémantique de 'contient' n'est pas simple du tout. En général, il serait préférable d'utiliser "index" pour tester si un tableau a une valeur spécifique, par exemple
/1
Si votre jq a
IN/1
alors une meilleure solution est d'utiliser:Si votre jq a
first/1
(comme jq 1.5), alors voici une rapide définition deIN/1
à utiliser:cat fruit.json | jq '.fruit as $f | "orange" | in($f[])'
=>jq: error (at <stdin>:9): Cannot check whether string has a string key
. Je suis sur jq 1.5.1.Il semble que cela ne fonctionne pas avec le haut-
in()
(si cela fonctionne pour vous, quelle version es-tu?). t travailler avec la coutumeIN(s)
vous posté le:cat fruit.json | jq 'def IN(s): . as $in | first(if (s == $in) then true else empty end) ; .fruit as $f | "ap" | IN($f[])'
=>true
S'il vous plaît dites-moi, il ya une manière plus concise pour ce faire (qui fonctionne avec les valeurs de chaîne, et ne prend pas en compte les sous-chaînes comme un match). La sémantique d'aucun de ces simples consonances fonctions (
in
,has
,inside
,contains
seuleindex
, comme vous l'avez suggéré!) est simple.. au moins quand il s'agit de quelque chose de tellement semblables que de vérifier si un tableau contient une chaîne de caractères...OriginalL'auteur peak
[AVERTISSEMENT: VOIR LES COMMENTAIRES ET LES RÉPONSES ALTERNATIVES.]
cat fruit.json | jq '.fruit' | jq 'contains(["orange"])'
Pourquoi êtes-vous en faisant deux appels à
jq
?jq '.fruit | contains(["orange"])'
fonctionne tout aussi bien.Aussi,
contains
exige seulement que"orange"
être un sous-chaîne d'un élément du tableau.OriginalL'auteur zinovii
Pour les futurs visiteurs, si vous arrive d'avoir le tableau dans une variable et que vous souhaitez vérifier la entrée contre elle, et vous avez jq 1.5 (sans), votre meilleure option est
index
mais avec une deuxième variable:.inputField as $inputValue | $storedArray|index($inputValue)
C'est fonctionnellement équivalent à
.inputField | IN($storedArray[])
.OriginalL'auteur aaa
Si vous êtes ouvert à l'aide de quelque chose d'autre que
jq
, puis je la recommande fortement Xidel.Avec elle vous pouvez combiner des JSONiq et XPath/XQuery pour le processus de JSON!
Pour l'avoir, il suffit de retourner un booléen:
De l'avoir de retour de l'élément si la matrice de
fruit
contient "pomme":Ci-dessus est "notation XPath". "Pointillé" (comme
jq
):OriginalL'auteur Reino
Avoir
jq
retour de réussite si le tableaufruit
contient"apple"
, et l'erreur dans le cas contraire:À la sortie de l'élément trouvé, omettre
>/dev/null
.OriginalL'auteur markusk