2013-09-03 5 views
93

Mam następujący plik json:Wybierz obiekty na podstawie wartości zmiennej w obiekcie z wykorzystaniem JQ

{ 
    "FOO": { 
     "name": "Donald", 
     "location": "Stockholm" 
    }, 
    "BAR": { 
     "name": "Walt", 
     "location": "Stockholm" 
    }, 
    "BAZ": { 
     "name": "Jack", 
     "location": "Whereever" 
    } 
} 

Używam JQ i chcą uzyskać „nazwa” elementy obiektów gdzie „lokalizacja” jest ' Sztokholm'.

wiem, że mogę dostać wszystkie nazwy przez

cat json | jq .[] | jq ."name" 
"Jack" 
"Walt" 
"Donald" 

Ale nie mogę dowiedzieć się, jak drukować tylko niektórych obiektów, biorąc pod uwagę wartość klucza sub (tutaj "location" : "Stockholm").

+8

FYI, poprosiłem, aby usunąć 'JQ -> jQuery' synonim: http://meta.stackexchange.com/q/ 195697/142802. –

+0

Dzięki, przegłosowałem :) – Daniel

Odpowiedz

72

do uzyskania strumienia zaledwie nazwami:

$ jq '.[] | select(.location=="Stockholm") | .name' json 

produkuje:

"Donald" 
"Walt" 

Aby uzyskać strumień odpowiadający (nazwę klucza, „nazwa” atrybutów) pary, należy rozważyć:

$ jq -c 'to_entries[] 
     | select (.value.location == "Stockholm") 
     | [.key, .value.name]' json 

wyjściowa:

["FOO","Donald"] 
["BAR","Walt"] 
+5

Nie jestem pewien, jak inna odpowiedź została wyprzedzona. – akhan

+0

Chce cały obiekt na podstawie lokalizacji: "Nie mogę wymyślić, jak wydrukować tylko niektóre obiekty, biorąc pod uwagę wartość podklucza" –

+0

To jest czysty geniusz @peak – look

14

Miałem podobny powiązane pytanie: Co zrobić, jeśli chciał oryginał powrót do formatu obiektu (z nazwami klawiszy, np FOO, BAR)?

Jq zapewnia to_entries i from_entries do konwersji między obiektami i parami para klucz-wartość. Że wraz z map wokół select

Te funkcje konwersji pomiędzy obiektem a tablicą klucz-wartość parach. Jeśli parametr to_entries jest przekazywany do obiektu, to dla każdego wpisu k: v w wejścia, tablica wyjściowa zawiera {"klucz": k, "wartość": v}.

from_entries dokonuje odwrotnej konwersji, a with_entries (foo) jest stenogramem dla to_entries | mapa (foo) | from_entries, użyteczne przy wykonywaniu niektórych operacji dla wszystkich kluczy i wartości obiektu. from_entries akceptuje klucz, klucz, nazwę, nazwę, wartość i wartość jako klucze.

jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries' 

{ 
    "FOO": { 
    "name": "Donald", 
    "location": "Stockholm" 
    }, 
    "BAR": { 
    "name": "Walt", 
    "location": "Stockholm" 
    } 
} 

Używanie with_entries stenografii, to staje się:

jq15 < json 'with_entries(select(.value.location=="Stockholm"))' 
{ 
    "FOO": { 
    "name": "Donald", 
    "location": "Stockholm" 
    }, 
    "BAR": { 
    "name": "Walt", 
    "location": "Stockholm" 
    } 
} 
Powiązane problemy