2016-07-21 13 views
5

mogę 1st elementu w json wewnątrz []zdobyć pierwszy (lub n'th) elementu w json JQ parsowania

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

Ale jeśli JSON jest już rozmontowane (na przykład, po przefiltrowaniu wpisy za pomocą "wybierz"), w jaki sposób mogę wybrać pojedynczy wpis i uniknąć błędu tutaj?

$ 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 

Odpowiedz

8

Można zawinąć wyniki select w tablicy:

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

wyjścia:

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

zastosowanie map

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

map recivce filtr filtrowanie tablicę.

to polecenie

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

daje wynik pośrednik

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

.[1] wziąć pierwszy element

+1

Nie sądzę, że się myliłem. – tink

2

jq zapewnia również first/0, last/0, nth/1 więc w tym przypadku filtr

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

produkuje

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

Dodatkowe formy strumieniowej 'first/1', 'last/1' i 'nth/2' są również dostępne tak z tymi danymi

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

produkuje

{ 
    "a": "x", 
    "b": true 
} 
{ 
    "a": "x", 
    "b": false 
} 
{ 
    "a": "x", 
    "b": false 
} 
Powiązane problemy