2016-07-21 7 views
5

ich das erste Element in einem json in []erhalten das erste (oder n-ten) Element in einem jq json Parsen

$ echo '[{"a":"x", "b":true}, {"a":"XML", "b":false}]' | jq '.[1]' 
{ 
    "a": "XML", 
    "b": false 
} 

Aber wenn die json bereits (zum Beispiel zerlegt bekommen kann, nach Filterung Einträge mit 'Auswählen'), wie kann ich einen einzelnen Eintrag auswählen und den hier angezeigten Fehler vermeiden?

$ echo '[{"a":"x", "b":true}, {"a":"x", "b":false},{"a":"XML", "b":false}]' | jq '.[] | select(.a == "x")' 
{ 
    "a": "x", 
    "b": true 
} 
{ 
    "a": "x", 
    "b": false 
} 
$ echo '[{"a":"x", "b":true}, {"a":"x", "b":false},{"a":"XML", "b":false}]' | jq '.[] | select(.a == "x") | .[1]' 
jq: error (at <stdin>:1): Cannot index object with number 

Antwort

8

Sie die Ergebnisse von select in einem Array wickeln kann:

jq '[.[]|select(.a=="x")][1]' your.json 

Ausgang:

{ 
    "a": "x", 
    "b": false 
} 
0

Verwendung map

cat raw.json|jq -r -c 'map(select(.a=="x"))|.[1]' 

map recivce a Filter ein Array zu filtern.

dieser Befehl

cat raw.json|jq -r -c 'map(select(.a=="x"))' 

geben dem Mittel Ergebnis

[{"a":"x","b":true},{"a":"x","b":false}]

.[1] nimmt das erste Element

+1

Ich glaube nicht, dass ich falsch war. – tink

2

jq bietet auch first/0, last/0, nth/1 so in diesem Fall ist der Filter

(map(select(.a == "x")) | first ) 
, (map(select(.a == "x")) | last ) 
, (map(select(.a == "x")) | nth(1)) 

produziert

{ 
    "a": "x", 
    "b": true 
} 
{ 
    "a": "x", 
    "b": false 
} 
{ 
    "a": "x", 
    "b": false 
} 

Zusätzliche Streaming Formen 'first/1', 'last/1' und 'nth/2' sind auch so mit diesen Daten

(first(.[] | select(.a == "x"))) 
, (last(.[] | select(.a == "x"))) 
, (nth(1; .[] | select(.a == "x"))) 

produziert

{ 
    "a": "x", 
    "b": true 
} 
{ 
    "a": "x", 
    "b": false 
} 
{ 
    "a": "x", 
    "b": false 
} 
Verwandte Themen