Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to nicely remove empty array in jq

Tags:

json

jq

I am reading O'Reilly's new "Data Science at the Command Line" and running into trouble using jq. I have some JSON (returned from the NYTimes Articles API) I am parsing with jq like so:

jq -c \ '[.response.docs[] | {date: .pub_date, type: .document_type, title: .headline.main }]' \ < myjsonfile.json 

So, I am looking for "response":"docs" (which is an array) and then matching every item in that array with "pub_type" etc., renaming it, and so on. This works great, but it adds an empty array at the end:

[{"date":"2009-01-02T00:00:00Z","type":"article","title":"SPARE TIMES: AROUND TOWN"},   {"date":"2009-01-02T00:00:00Z","type":"article","title":"Catskill Home Prices: How Low Will They Go?"}, {"date":"2009-01-01T00:00:00Z","type":"article","title":"Ominous Cutbacks At Chanel"}] []  

How do I get rid of the empty array? My solution right now is to pipe the output back into jq, but that feels really suboptimal. So this works:

jq -c \ '[.response.docs[] | {date: .pub_date, type: .document_type, title: .headline.main }]' | \ < myjsonfile.json |  jq 'if length > 0 then . else empty end' 

But that feels ugly. Is there a nicer way of doing this?

like image 804
Gabriel Perdue Avatar asked Oct 04 '14 17:10

Gabriel Perdue


People also ask

How do you delete an empty array?

Answer: Use the PHP array_filter() function You can simply use the PHP array_filter() function to remove or filter empty values from an array. This function typically filters the values of an array using a callback function.

What is jq slurp?

The slurp option ( -s ) changes the input to the jq program. It reads all the input values and build an array for the query input. Using with the raw input option ( -R ) means reading the entire input as a string. The inputs function is a special stream that emits the remaining JSON values given to the jq program.


1 Answers

Use the select filter where length > 0.

select(length > 0) 
like image 144
Jeff Mercado Avatar answered Sep 30 '22 01:09

Jeff Mercado