2015-04-29 10 views
6

Io uso il seguente comando JQ per filtrare il JSON. Il mio requisito è quello di filtrare il messaggio JSON se il nodo previsto è presente. Oppure, non fare nulla. Quindi, io uso if, elif, ....JSON JQ se non altro

sed -n "s/.*Service - //p" $1/response.log* | 
    jq "if (.requests | length) != 0 then .requests |= map(select(.id == \"123\")) 
     elif (.result | length) != 0 then .result |= map(select(.id== \"123\")) 
     else " " end" > ~/result.log 

Sembra che il resto sia obbligatorio qui. Non voglio fare nulla all'interno del blocco else. C'è comunque, posso ignorare altro o semplicemente stampare qualche whitespce dentro altro.

Nel caso precedente, stampa le virgolette doppie "" nel file dei risultati.

risposta

11

Si consiglia di utilizzare il linguaggio:

if CONDITION then WHATEVER else empty end

empty è un filtro che emette nulla - nemmeno nulla , che è dopotutto qualcosa (vale a dire un valore JSON). È un po 'come un buco nero, solo più nero - consumerà tutto ciò che viene offerto, ma a differenza di un buco nero, non emette nemmeno la radiazione di Hawking.

Nel tuo caso, il tuo hanno un "elif" in modo da utilizzare "altro vuoto" è probabilmente quello che volete, ma per riferimento, quanto sopra è esattamente equivalente a:

select(CONDITION) | WHATEVER 

P.S. La mia ipotesi è che qualunque sia l'obiettivo del comando sed, potrebbe essere fatto in modo più affidabile come parte del programma jq, forse usando walk/1.

+0

Voto precedente per la frase finale. – turiyag

+0

come utilizzare l'istruzione if per valori come array. Ad esempio: . [] | {Result ": if (.foo == null) quindi [] end} [{" foo ": null," bar ":" dati meno interessanti "}, {" foo ":" null "," bar ":" dati meno interessanti "}] – devanathan

+0

Per favore, fai una nuova domanda SO. – peak

1

Poiché non si apportano ulteriori modifiche all'oggetto, utilizzare semplicemente il filtro "identità" ..

if (.requests | length) then ... else . end 

D'altra parte, si sta solo aggiornare la proprietà requests o result se non vuota utilizzando map. Il controllo non è necessario. Se è vuoto, restituirà vuoto.

È possibile semplificare il filtro a poco:

.requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))