J'ai un tableau et je dois vérifier si des éléments existent dans ce tableau ou pour obtenir cet élément du tableau en utilisant Jq, fruit.json :
{
"fruit": [
"Apple",
"orange",
"pomegranate",
"apricot",
"mango"
]
}
cat fruit.json | jq '.fruit .Apple'
ne marche pas
La sémantique de 'contient' n'est pas simple du tout. En général, il serait préférable d’utiliser index pour vérifier si un tableau a une valeur spécifique, par exemple.
.fruit | index( "orange" )
Si votre jq a IN/1
, une meilleure solution consiste à l'utiliser:
.fruit as $f | "orange" | IN($f[])
Si votre jq a first/1
(comme jq 1.5), voici une définition rapide de IN/1
à utiliser:
def IN(s): first((s == .) // empty) // false;
Si vous êtes prêt à utiliser autre chose que jq
, je peux fortement recommander Xidel .
Vous pouvez combiner JSONiq et XPath/XQuery pour traiter JSON!
Pour qu'il retourne simplement un booléen:
$ xidel -s fruit.json -e '$json/contains((fruit)(),"Apple")'
true
Pour qu'il renvoie l'élément si le tableau fruit
contient "Apple":
$ xidel -s fruit.json -e '$json/(fruit)()[contains(.,"Apple")]'
Apple
Ci-dessus, "notation XPath". "Notation par points" (comme jq
):
$ xidel -s fruit.json -e '($json).fruit()[contains(.,"Apple")]'
Apple
Pour que jq
retourne success si le tableau fruit
contient "Apple"
, sinon le code d'erreur est le suivant:
jq -e '.fruit[]|select(. == "Apple")' fruit.json >/dev/null
Pour sortir l'élément trouvé, omettez >/dev/null
.