Read File into JSON List with jq
You have a file and you want to convert the contents into a JSON list. How can
we leverage jq
to do that?
$ cat file
one
two
three
$ jq --null-input --raw-input '[inputs]'
[
"one",
"two",
"three"
]
--raw-input
(short -R
) takes each line in the input as a string and passes
it to the filter, instead of interpreting the file as containing JSON.
--null-input
(short -n
) is important:
$ printf '%s\n' one two three | jq --raw-input '[inputs]'
[
"two",
"three"
]
--null-input
doesn’t read the input at all. Instead, it will run the filter
with null
as input. In our case, jq
encounters inputs
here, which triggers
an I/O operation that reads the contents of the file (or files) as strings
(because of --raw-input
) into a list (because inputs
is surrounded by
[...]
).
Without --null-input
, jq
takes the first line of the file, and passes that
to the filter. The filter discards this input (we don’t use the identity
operator .
) and proceeds to read all remaining inputs (two
and three
).
Obviously, this is not what we want.
Knowing this, we could do the following (but really shouldn’t):
$ printf '%s\n' one two three | jq --raw-input '[.] + [inputs]'
[
"one",
"two",
"three"
]
Remove Empty Strings from Output
If you get empty strings for whatever reason in your output, you can remove them:
$ printf '%s\n' '' one two three | jq -n -R '[inputs]'
[
"",
"one",
"two",
"three"
]
$ printf '%s\n' '' one two three | jq -n -R '[inputs | select(length > 0)]'
[
"one",
"two",
"three"
]