web-dev-qa-db-fra.com

Comment vérifier si l'élément existe dans un tableau avec jq

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

13
idmitriev

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" )

EN 1

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;
22
peak

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
1
Reino

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.

0
markusk