Reputation: 2443
I have a file where each line is a JSON object. I'd like to convert the file to a JSON array.
The file looks something like this:
{"address":"[email protected]", "topic":"Some topic."}
{"address":"[email protected]", "topic":"Another topic."}
{"address":"[email protected]", "topic":"Yet another topic."}
I'm using bash and jq.
I tried
jq --slurp --raw-input 'split("\n")[:-1]' my_file
But that just treats each line as a string creating a JSON array of strings.
[
"{\"address\":\"[email protected]\", \"topic\":\"Some topic.\"}",
"{\"address\":\"[email protected]\", \"topic\":\"Another topic.\"}",
"{\"address\":\"[email protected]\", \"topic\":\"Yet another topic.\"}"
]
I'd like to have:
[
{"address":"[email protected]", "topic":"Some topic."},
{"address":"[email protected]", "topic":"Another topic."},
{"address":"[email protected]", "topic":"Yet another topic."}
]
Upvotes: 6
Views: 7793
Reputation: 116690
For the task at hand, using jq's "slurp" option or [inputs]
entails a potentially huge waste of resources.
A trivial but efficient solution can be implemented in awk as follows:
awk 'BEGIN {print "[";} NF==0{next;} n=="" {print;n++;next;} {print ","; print;} END {print "]"}'
An equivalent efficient solution in jq is possible using foreach
and inputs
, and is left as an exercise.
Upvotes: 3
Reputation: 295316
jq -n '[inputs]' <in.jsonl >out.json
...or, as suggested by @borrible:
jq --slurp . <in.jsonl >out.json
Upvotes: 10