2016-08-01 23 views
7

Powiedz, że mam następujący JSON, przechowywany w mojej zmiennej jsonVariable.jq - Jak wydrukować nadrzędną wartość obiektu, gdy jestem już głęboko w obiektach potomnych obiektu?

{ 
    "id": 1, 
    "details": { 
     "username": "jamesbrown", 
     "name": "James Brown", 
    } 

} 

I przeanalizować ten JSON z JQ stosując następujący:

echo $jsonVariable | jq '.details.name | select(.name == "James Brown")' 

To da mi wyświetlamy

Jamesa Browna

ale co, jeśli chcę, aby uzyskać id tej osoby również? Teraz zdaję sobie sprawę, że jest to trudny i prosty przykład - program, nad którym pracuję w tej chwili, ma 5 lub 6 poziomów głębokości z wieloma różnymi funkcjami JQ innymi niż wybrane. Potrzebuję sposobu, aby wybrać pole rodzica, gdy mam już 5 lub 6 warstw głębokości po przeprowadzeniu różnych metod filtrowania.

Czy ktoś może pomóc? Czy istnieje sposób "odwrotu", z powrotem do rodzica? (Nie wiem, czy mam sensu!)

+0

wydaje się, że chcesz ".id | select (.name == "James Brown") 'Czy próbowałeś tego? – mrtig

+0

Ach, przepraszam, nie wyjaśniłem poprawnie. Chciałbym mieć zarówno – Xenidious

Odpowiedz

15

na bardziej ogólne podejście, zapisz wartość „macierzystej” element na poziomie szczegółów chcesz, to rurę go w końcu filtr:

jq '. as $parent | .details.name | select(. == "James Brown") | $parent'

Oczywiście , dla trywialnego przypadku naraża, można pominąć ten całkowicie:

jq 'select(.details.name == "James Brown")'

również pod uwagę, że jeśli wybierając filtry zwracają wiele dopasowań dla pojedynczego obiektu nadrzędnego, otrzymasz kopię obiektu nadrzędnego dla każdego dopasowania. Możesz chcieć upewnić się, że wybrane filtry zwracają tylko jeden element na poziomie nadrzędnym, zawijając wszystkie dopasowania poniżej poziomu nadrzędnego do tablicy lub deduplikując ostateczny wynik z unique.

+0

To jest dokładnie to, czego potrzebowałem. Dzięki! – Xenidious

0

Daj ten strzał:

echo $jsonVariable | jq '{Name: .details.name, Id: .Id} | select(.name == "James Brown")' 
0

Zamiast zapytań do wartości masz do testowania, zapytania do obiektu głównego, który zawiera wartość pytasz i wartości, które chcesz wybrać.

Potrzebujesz obiektu zawierającego zarówno id, jak i name.

$ jq --arg name 'James Brown' 'select(.details.name == $name).id' input.json