it-swarm.com.de

So prüfen Sie, ob ein Element mit jq im Array vorhanden ist

Ich habe ein Array und muss überprüfen, ob Elemente in diesem Array vorhanden sind, oder dieses Element mithilfe von Jq, fruit.json aus dem Array abrufen.

{
    "fruit": [
        "Apple", 
        "orange",
        "pomegranate",
        "apricot",
        "mango"
    ]
}


cat fruit.json | jq '.fruit .Apple' 

funktioniert nicht

13
idmitriev

Die Semantik von 'enthält' ist überhaupt nicht einfach. Im Allgemeinen ist es besser, "Index" zu verwenden, um zu testen, ob ein Array einen bestimmten Wert hat, z.

.fruit | index( "orange" )

IN 1

Wenn Ihr jq IN/1 hat, ist es eine bessere Lösung, es zu verwenden:

.fruit as $f | "orange" | IN($f[])

Wenn Ihr jq first/1 (wie auch jq 1.5) hat, dann ist hier eine schnelle Definition von IN/1 zu verwenden:

def IN(s): first((s == .) // empty) // false;
22
peak

[WARNUNG: SIEHE DIE KOMMENTARE UND ALTERNATIVE ANTWORTEN.]

cat fruit.json | jq '.fruit | contains(["orange"])'
2
zinovii

Für zukünftige Besucher ist die beste Option index, wenn Sie zufällig das Array in einer Variablen haben und das Eingabe mit jq 1.5 (ohne IN) vergleichen möchten. aber mit einer zweiten Variablen:

.inputField as $inputValue | $storedArray|index($inputValue)

Dies ist funktional äquivalent zu .inputField | IN($storedArray[]).

1
aaa

Wenn Sie offen sind, etwas anderes als jq zu verwenden, kann ich Xidel wärmstens empfehlen.
Damit können Sie JSONiq und XPath/XQuery kombinieren, um JSON zu verarbeiten!

Um es zu haben, gib einfach einen Boolean zurück:

$ xidel -s fruit.json -e '$json/contains((fruit)(),"Apple")'
true

Um das Element zurückgeben zu lassen, wenn das Array fruit "Apple" enthält:

$ xidel -s fruit.json -e '$json/(fruit)()[contains(.,"Apple")]'
Apple

Oben ist "XPath-Notation". "Punktnotation" (wie jq):

$ xidel -s fruit.json -e '($json).fruit()[contains(.,"Apple")]'
Apple
1
Reino

Damit jq Erfolg hat, wenn das Array fruit"Apple" enthält, und einen Fehler, andernfalls:

jq -e '.fruit[]|select(. == "Apple")' fruit.json >/dev/null

Lassen Sie >/dev/null aus, um das gefundene Element auszugeben.

0
markusk